您好,登錄后才能下訂單哦!
這篇文章主要介紹“Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區別是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區別是什么”文章能幫助大家解決問題。
count() 是一個聚合函數,對于返回的結果集,一行行地判斷,如果 count 函數的參數不是 NULL,累計值就加 1,否則不加。最后返回累計值。
count(*)、count(1) 和 count(主鍵id) 都表示返回滿足條件的結果集的總行數;而count(字段)則表示返回滿足條件的數據行里面,參數“字段”不為 NULL 的總個數。
對于 count(主鍵id) 來說,InnoDB 引擎會遍歷整張表,把每一行的 id 值都取出來,返回給 server 層。server 層拿到 id 后,判斷 id 不為 NULL 的,就按行累加
對于 count(1) 來說,InnoDB 引擎遍歷整張表,但不取值。server 層對于返回的每一行,放一個數字 “1” 進去,判斷是不可能為空的,按行累加
總的來說, count(1) 執行得要比 count(主鍵id) 快一些。因為從引擎返回 id 會涉及到解析數據行,以及拷貝字段值的操作
如果這個 “字段” 定義為 not null,一行行地從記錄里面讀出這個字段,判斷不可能為 null,按行累加。
注意:count(非空字段)與count(主鍵id) 的效率是一樣的
如果這個 “字段” 定義為 可為null,那么執行的時候,判斷到有可能是 null,還要把值取出來再判斷一下,不是 null 才累加
count(*) 是例外,優化器專門對其做了優化,并不會把全部字段取出來,而是直接按行累加。
按照效率排序,count(可空字段) < count(非空字段) = count(主鍵id)< count(1) ≈ count(*),所以盡量使用 count(*) 就行了
count(*)包括了所有的列,相當于行數,在統計結果的時候,不會忽略列值為NULL。
count(1)包括了忽略所有列,用1代表代碼行,在統計結果的時候,不會忽略列值為NULL 。
count(列名)只包括列名那一列,在統計結果的時候,會忽略列值為空(這里的空不是只空字符串或者0,而是表示null)的計數,即某個字段值為NULL時,不統計。
列名為主鍵,count(列名)會比count(1)快。
列名不為主鍵,count(1)會比count(列名)快。
如果表多個列并且沒有主鍵,則 count(1) 的執行效率優于 count(*)。
如果有主鍵,則 select count(主鍵)的執行效率是最優的。
如果表只有一個字段,則 select count(*)最優。
mysql> create table counttest(name char(1), age char(2)); Query OK, 0 rows affected (0.03 sec) mysql> insert into counttest values -> ('a', '14'),('a', '15'), ('a', '15'), -> ('b', NULL), ('b', '16'), -> ('c', '17'), -> ('d', null), ->('e', ''); Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0 mysql> select * from counttest; +------+------+ | name | age | +------+------+ | a | 14 | | a | 15 | | a | 15 | | b | NULL | | b | 16 | | c | 17 | | d | NULL | | e | | +------+------+ 8 rows in set (0.00 sec) mysql> select name, count(name), count(1), count(*), count(age), count(distinct(age)) -> from counttest -> group by name; +------+-------------+----------+----------+------------+----------------------+ | name | count(name) | count(1) | count(*) | count(age) | count(distinct(age)) | +------+-------------+----------+----------+------------+----------------------+ | a | 3 | 3 | 3 | 3 | 2 | | b | 2 | 2 | 2 | 1 | 1 | | c | 1 | 1 | 1 | 1 | 1 | | d | 1 | 1 | 1 | 0 | 0 | | e | 1 | 1 | 1 | 1 | 1 | +------+-------------+----------+----------+------------+----------------------+ 5 rows in set (0.00 sec)
關于“Mysql中count(*)、count(1)、count(主鍵id)與count(字段)的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。