為什麼count 這麼慢

2021-10-07 19:58:35 字數 894 閱讀 7284

不同count的用法

count()是乙個聚合函式,對於返回的結果集,一行行地判斷,如果count函式的引數不是null,累計值就加1,否則不加。最後返回累計值。

count的用法有多種,分別是count(*)、count(字段)、count(1)、count(主鍵id)。那麼多種用法,到底有什麼差別呢?當然,「前提是沒有where條件語句」。

count(id):innodb引擎會遍歷整張表,把每一行的id值都取出來,返回給server層。server層拿到id後,判斷是不可能為空的,就按行累加。

count(1):innodb引擎遍歷整張表,但不取值。server層對於返回的每一行,放乙個數字1進去,判斷是不可能為空的,按行累加。

count(字段):

如果這個「字段」是定義為not null的話,一行行地從記錄裡面讀出這個字段,判斷不能為null,按行累加;

如果這個字段定義允許為null,那麼執行的時候,判斷到有可能是null,還要把值取出來再判斷一下,不是null才累加。

count(*):不會把全部字段取出來,而是專門做了優化,不取值。count(*)肯定不是null,按行累加。

所以結論很簡單:「按照效率排序的話,count(字段)「注意」:這裡肯定有人會問,count(id)不是走的索引嗎,為什麼查詢效率和其他的差不多呢?陳某在這裡解釋一下,雖然走的索引,但是還是要一行一行的掃瞄才能統計出來總數。

總結myisam表雖然count(*)很快,但是不支援事務;

show table status命令雖然返回很快,但是不準確;

innodb直接count(*)會遍歷全表(沒有where條件),雖然結果準確,但會導致效能問題。

快取系統的儲存計數雖然簡單效率高,但是無法保證資料的一致性。

資料庫儲存計數很簡單,也能保證資料的一致性,建議使用。

為什麼count 這麼慢?

當我們查詢一張資料量很大的表時,使用sql select count from t1 這條sql非常耗時。那麼當執行count 的時候發生了什麼呢?count 1 的sql執行計畫如下 count 的sql執行計畫如下 兩者執行計畫相同,所以速度相同。首先初始化時,執行一次精確的計數 select ...

資料庫專題 深入理解count 為什麼這麼慢

曾經在依次面試中被問到過這麼乙個問題,假設開發乙個交易平台過程中,有遇到過需要計算交易記錄總數的情況該怎麼辦。可能大多數人的回答都是用select count from t 不就搞定了嗎 但是,面試官又問到隨著系統中記錄數越來越多,這條語句執行得越來越慢。那麼為什麼這麼慢呢,今天我們就來聊一聊原因吧...

PHP的echo為什麼這麼慢

作為乙個行走江湖多年的老中醫,今天受命去解決一例前端頁面展現緩慢的問題。問題頁的情況如下 apache php 使用smarty模板輸出內容 頁面最終輸出內容較大,80k 頁面執行時間在500ms以上 祭出法寶xhprof對問題頁面做了細緻檢查,發現頁面的瓶頸竟然是模板 編譯後的 中的乙個echo語...