一. MySQL 的邏輯架構圖
二. 對比各種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). 返回字段值,會涉及解析行數據以及拷貝字段值的操作