【MySQL】count統計哪種更快

一. MySQL 的邏輯架構圖

image

二. 對比各種count方法(以Innodb爲例)

1.count(*)

a). InnoDB存儲引擎遍歷整張表,但不取值。server 層對於返回的每一行,不判斷是否爲空,直接按行累加。

2. count(1)

a). InnoDB存儲引擎遍歷整張表,但不取值。server 層對於返回的每一行,放一個數字"1"進去,判斷是否爲空(值不會爲空,但邏輯如此),不爲空則按行累加。

3.count(主鍵)

a). InnoDB存儲引擎會遍歷整張表,把每一行的【主鍵值】取出來,返回給 server 層。server 層拿到【主鍵值】後,判斷是否爲空(主鍵不會爲空,但邏輯如此),不爲空則按行累加。

b). 返回【主鍵值】,會涉及解析行數據以及拷貝字段值的操作

4. count(字段)

a). 字段不可空(Not Null):InnoDB存儲引擎會遍歷整張表,把每一行的【字段值】取出來,返回給 server 層。server 層拿到【字段值】後,按行累加。

b). 字段可空(Null):InnoDB存儲引擎會遍歷整張表,把每一行的【字段值】取出來,返回給 server 層。server 層拿到【字段值】後,判斷是否爲空,不爲空則按行累加。

c). 返回字段值,會涉及解析行數據以及拷貝字段值的操作

三. 結論

1. 【不取值】可以理解爲:返回了一行,但是隻有0個字段

2. count統計不一定會走主鍵索引,而是根據查詢條件選擇最小的索引樹

3. 按照效率排序,count(字段) < count(主鍵 id) < count(1) ≈ count(*),所以儘量使用 count(*)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章