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