都2020年了,你還不知道count(1)和count(*)誰效率更高嗎?

今天公司的一個需求需要統計一個數據庫中表的行數有多少,二話不說當然就直接用count()這個聚合函數,以前經常聽到一種說法說count(1)的效率比count(*)要高,於是測試了一下count(1)和count(*)的速度差距,發現兩者的查詢速度很接近,甚至count(*)要更快一些,於是就有了這篇文章。

1.count()的用法

count()聚合函數應該是我們學習數據庫時最早學到的函數,主要用於查詢表中數據的數量,常用的查詢語句有count(*),count(字段),count(1),count(主鍵)。

2.count(主鍵)

對於count(主鍵)來說,會遍歷所有主鍵取出所有的值並按行累加,因爲主鍵不會爲空,最終會返回總的行數。

3.count(字段)

對於count(字段)來說,會遍歷所有該字段,如果爲null則跳過,否則取出並累加,最後返回的是非null的總和。

4.count(1)

對於count(1)來說,會遍歷整張表,但不取值,直接計算行數。因此count(1)的性能要高於count(主鍵)。和count(主鍵)相比,count(1)少了一個取值的動作,減少的這個取值的動作使得count(1)的效率高於count(主鍵)。

5.count(*)

對於count(*)來說,count(*)的用法在早期的數據庫和現在的數據庫中有較大的差距,在早期的數據庫中,count(*)有可能會導致全表的掃描,因此效率會低。如今的數據庫引擎對count(*)做了優化,比如MyIsam引擎中count(*)會直接讀取一個總行數的值,因此速度是最快的,InnoDB也同樣對count(*)做了優化,用類似count(1)的方式獲取行數,因此count(*)效率接近count(1)。

6.總結

總的來講,在如今的系統中,你大可放心的使用count(*),他的效率是最高的,如果你要兼容10年前的系統,那就使用count(1)。

我建了一個公衆號【魚仔ly】,每日更新java基礎、源碼、項目,我們一起衝大廠!

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