MySQL优化(四):count()
count()不同寫法的區(qū)別
COUNT(字段名):返回SELECT語句檢索的行中值不為NULL的行數(shù)
COUNT(1):表示的是直接查詢符合條件的數(shù)據(jù)庫表的行數(shù)(會包含值為NULL的行數(shù))。其中1指的是表中的第一個字段,如有表 table(id, column1),則1指 id。
COUNT(*):表示的是直接查詢符合條件的數(shù)據(jù)庫表的行數(shù)(會包含值為NULL的行數(shù)),其中* 指所有所有字段,并且是SQL92定義的標(biāo)準(zhǔn)統(tǒng)計行數(shù)的語法,因為是標(biāo)準(zhǔn)語法,所以MySQL數(shù)據(jù)庫進行過很多優(yōu)化,推薦使用。
COUNT(1)和COUNT(*)區(qū)別
MySQL官方文檔這么說:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
即InnoDB 對 count(1) 和 count(*) 的進行相同操作,兩者性能相同。
由上述可知,可以把count(*) 和 count(1) 相同對待, 都是計算滿足條件的行數(shù)(包括NULL),但count(*)是標(biāo)準(zhǔn)語法,所以推薦使用count(*)。
count() 索引使用情況
(1) count(*)、count(1)、count(主鍵)
如果存在二級索引則,mysql會使用二級索引計算 count(*)、count(1)、count(主鍵) 的值。
如果不存在二級索引則使用 主鍵索引(聚簇索引)計算 count(*)、count(1)、count(主鍵) 的值。
因為二級索引只存主鍵值,而沒存真實數(shù)據(jù),所以二級索引樹比主鍵索引樹更小,所以mysql優(yōu)化器會選擇成本更小的二級索引,不過要注意成本小,不意味著消耗時間少,這二者不是完全等同的。
具體案例分析可參考:
- 使用Count(*),count(主鍵),count(1)時,是走主鍵索引還是二級索引
- SELECT COUNT(*) 是否會造成全表掃描?
(2) count(非主鍵字段)
如果不存在包含該字段的索引,則會通過全表掃描來計算 count(字段)的值。
如果存在包含該字段的二級索引,則會通過掃描此二級索引 計算 count(字段) 的值。字段在索引的順序無影響,只要索引包含該字段,即可利用該索引計算行數(shù)。
總結(jié)
(1) count(*)、count(1)、count(主鍵) 如果存在任何一個二級索引就會通過二級索引計算,否則使用主鍵索引
(2) count(非主鍵) 如果存在包含該字段的索引則通過索引計算,否則會使用全表掃描
總結(jié)
以上是生活随笔為你收集整理的MySQL优化(四):count()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 影楼怎么制作网页(影楼怎么制作网页视频)
- 下一篇: MySQL 对于千万级的大表要怎么优化?