詳解mysql中count函式的正確使用方法。
1. 描述
在mysql中,當我們需要獲取某張表中的總行數時,一般會選擇使用下面的語句
select count(*) from table;其實count函式中除了*還可以放其他引數,比如常數、主鍵id、字段,那麼它們有什麼區別?各自效率如何?我們應該使用哪種方式來獲取表的行數呢?
當搞清楚count函式的執行原理後,相信上面幾個問題的答案就會了然於胸。
2. 表結構
為了解決上述的問題,我建立了一張 user 表,它有兩個字段:主鍵id和name,後者可以為null,建表語句如下。
create table `user` (在該錶中共有6000000條資料,前1000000條資料行的name欄位為空,其餘資料行name=id,使用儲存過程造測試資料的**如下`id` int(11) not null auto_increment comment '主鍵',
`name` varchar(255) default null comment '姓名',
primary key (`id`)
) engine=innodb default charset=utf8;
-- 使用儲存過程造測試資料3. 執行 sql 語句及結果delimiter;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=6000000)do
insert into user values(i, i);
set i=i+1;
end while;
end;;
delimiter;
call idata();
-- 將前1000000條資料的name欄位置為null
update user set name=null where id<1000000;
為了區分count函式不同引數的區別,主要從執行時間和掃瞄行數這兩方面來描述sql的執行效率,同時還會從返回結果來描述`count函式的特性。
3.1 *符號
mysql> select count(*) from user;遍歷全表,不取值(優化後,必定不是null,不取值),累加計數,最終返回結果。+----------+
| count(*) |
+----------+
| 6000000 |
+----------+
1 row in set (0.76 sec)
3.2 常數
mysql> select count(1) from user;遍歷全表,一行行取資料,將每一行賦值為1,判斷到該字段不可為空,累加計數,最終返回結果。+----------+
| count(1) |
+----------+
| 6000000 |
+----------+
1 row in set (0.76 sec)
3.3 非空字段
mysql> select count(id) from user;遍歷全表,一行行取資料(會選擇最小的索引樹來遍歷,所以比相同情況下的count欄位效率更高),取每行的主鍵id,判斷到該字段不可為空,累加計數,最終返回結果。+-----------+
| count(id) |
+-----------+
| 6000000 |
+-----------+
1 row in set (0.85 sec)
3.4 可為空的字段
mysql> select count(name) from user;4. 執行結果分析+-------------+
| count(name) |
+-------------+
| 5900001 |
+-------------+
1 row in set (0.93 sec)
4.1 結果集
首先從結果集的角度來看,前三條 sql 語句的目的是一樣的——返回的是所有行數,而count
函式的引數是普通欄位且字段預設為null
的時候,它返回的是該字段不為null
的行數。
4.2 執行時間
從執行時間上來看的話,效率大致是count(可為空的字段) < count(非空字段) < count(常數) < count(*)
。
5. 總結
count是乙個聚合函式,對於返回的結果集,一行行地判斷,如果count函式的引數不是null,累計值就加1,否則不加。最後返回累計值。
所以,最好還是用count(*)。
mysql之count 函式詳解
1.count 函式是用來統計表中記錄的乙個函式,返回匹配條件的行數。2.count 語法 1 count 包括所有列,返回表中的記錄數,相當於統計表的行數,在統計結果的時候,不會忽略列值為null的記錄。2 count 1 忽略所有列,1表示乙個固定值,也可以用count 2 count 3 代替...
MySql中的count 函式
1.count 函式是用來統計表中記錄的乙個函式,返回匹配條件的行數。2.count 語法 1 count 包括所有列,返回表中的記錄數,相當於統計表的行數,在統計結果的時候,不會忽略列值為null的記錄。2 count 1 忽略所有列,1表示乙個固定值,也可以用count 2 count 3 代替...
MySql中的count函式
1.count 函式是用來統計表中記錄的乙個函式,返回匹配條件的行數。2.count 語法 1 count 包括所有列,返回表中的記錄數,相當於統計表的行數,在統計結果的時候,不會忽略列值為null的記錄。2 count 1 忽略所有列,1表示乙個固定值,也可以用count 2 count 3 代替...