一文帶你搞懂爲什麼大家都推薦count(*)而不是count(id)

一文帶你搞懂爲什麼大家都推薦count(*)而不是count(id)

在開發中,我們經常用到count這個函數來計算行數,尤其是後臺列表展示。

那麼究竟應該使用count()還是count(id)呢?很多人,很多書籍都推薦使用count()。

count(*)

在每個引擎裏面其實是不一樣的,比如myisam引擎,會把總行數存起來,如果你需要總行數,那麼直接返回,那速度嗖嗖嗖的。

我們常用的innoDB引擎呢,他就真的是一行行計數了。

那爲什麼一行行計數還推薦count(*)呢?

innoDB是索引樹組織表,不僅有主鍵索引樹還有其他索引樹,而count(*)反正是要全表掃描,那麼優化器會去遍歷最小的索引樹,普通索引樹的葉子節點只有id,當然要更小一些。

執行這個的時候innoDB遍歷全表,但不取值,並且不判斷,因爲count(*)肯定不是null,直接累加。

count(id)

執行這個的時候innoDB遍歷全表,把每一行數據的id值取出來返回給mysql,mysql拿到數據以後判斷不爲空則+1。累加後返回。

count(1)

執行這個的時候innoDB遍歷全表,但不取值,直接返回給mysql,mysql收到返回值,給返回值賦值1,然後判斷,累加。

count(字段)

這個和count(id)類似,只不過如果允許爲空的話,需要把值取出來做個判斷,多個判斷。如果不允許爲空,那就一樣了。

這麼一對比,就看出來了,顯然count()更快,這也是因爲mysql對count()這個語句專門做了優化。所以更推薦count(*)

count(字段) 慢於 count(id) 慢於 count(1) 慢於 count(*)

除了這些我們同樣可以自己實現計數。

我們可以使用緩存系統,將計數放入緩存,然後持久化。比如redis。

我們也可以直接創建一個計數的表,把計數字段放入表裏。

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