数据库面试题【十九、count(字段) count(主键 id) count(1)count(*)的区别】
生活随笔
收集整理的這篇文章主要介紹了
数据库面试题【十九、count(字段) count(主键 id) count(1)count(*)的区别】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
count(可空字段)
掃描全表,讀到server層,判斷字段可空,拿出該字段所有值,判斷每一個值是否為空,不為空則累加
count(非空字段)與count(主鍵 id)
掃描全表,讀到server層,判斷字段不可空,按行累加。
count(1)
掃描全表,但不取值,server層收到的每一行都是1,判斷不可能是null,按值累加。
注意:count(1)執(zhí)行速度比count(主鍵 id)快的原因:從引擎返回 id 會涉及到解析數(shù)據(jù)行,以及拷貝字段值的操作。
count(*)
MySQL 執(zhí)行count(*)在優(yōu)化器做了專門優(yōu)化。因為count(*)返回的行一定不是空。掃描全表,但是不取值,按行累加。
看到這里,你會說優(yōu)化器就不能自己判斷一下嗎,主鍵 id 肯定是非空的,為什么不能按照 count(*) 來處理,多么簡單的優(yōu)化。當然 MySQL 專門針對這個語句進行優(yōu)化也不是不可以。但是這種需要專門優(yōu)化的情況太多了,而且 MySQL 已經(jīng)優(yōu)化過 count(*) 了,你直接使用這種語句就可以了。
性能對比結(jié)論
count(可空字段) < count(非空字段) = count(主鍵 id) < count(1) ≈ count(*)
總結(jié)
以上是生活随笔為你收集整理的数据库面试题【十九、count(字段) count(主键 id) count(1)count(*)的区别】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库面试题【十八、优化关联查询优化子查
- 下一篇: linux cmake编译源码,linu