詳解MySQL中count函式的正確使用方法

2022-09-14 22:27:30 字數 2651 閱讀 2473

詳解mysql中count函式的正確使用方法。

1. 描述

在mysql中,當我們需要獲取某張表中的總行數時,一般會選擇使用下面的語句

select count(*) from table;
其實count函式中除了*還可以放其他引數,比如常數、主鍵id、字段,那麼它們有什麼區別?各自效率如何?我們應該使用哪種方式來獲取表的行數呢?

當搞清楚count函式的執行原理後,相信上面幾個問題的答案就會了然於胸。

2. 表結構

為了解決上述的問題,我建立了一張 user 表,它有兩個字段:主鍵id和name,後者可以為null,建表語句如下。

create table `user` (

`id` int(11) not null auto_increment comment '主鍵',

`name` varchar(255) default null comment '姓名',

primary key (`id`)

) engine=innodb default charset=utf8;

在該錶中共有6000000條資料,前1000000條資料行的name欄位為空,其餘資料行name=id,使用儲存過程造測試資料的**如下

-- 使用儲存過程造測試資料

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;

3. 執行 sql 語句及結果

為了區分count函式不同引數的區別,主要從執行時間和掃瞄行數這兩方面來描述sql的執行效率,同時還會從返回結果來描述`count函式的特性。

3.1 *符號

mysql> select count(*) from user;

+----------+

| count(*) |

+----------+

| 6000000 |

+----------+

1 row in set (0.76 sec)

遍歷全表,不取值(優化後,必定不是null,不取值),累加計數,最終返回結果。

3.2 常數

mysql> select count(1) from user;

+----------+

| count(1) |

+----------+

| 6000000 |

+----------+

1 row in set (0.76 sec)

遍歷全表,一行行取資料,將每一行賦值為1,判斷到該字段不可為空,累加計數,最終返回結果。

3.3 非空字段

mysql> select count(id) from user;

+-----------+

| count(id) |

+-----------+

| 6000000 |

+-----------+

1 row in set (0.85 sec)

遍歷全表,一行行取資料(會選擇最小的索引樹來遍歷,所以比相同情況下的count欄位效率更高),取每行的主鍵id,判斷到該字段不可為空,累加計數,最終返回結果。

3.4 可為空的字段

mysql> select count(name) from user;

+-------------+

| count(name) |

+-------------+

| 5900001 |

+-------------+

1 row in set (0.93 sec)

4. 執行結果分析

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 代替...