mysql中count x 到底慢不慢

2021-10-10 05:15:25 字數 1378 閱讀 5731

參考: 總結

myisam 表不支援事務,但是count(*) 很快,因為他直接記錄了乙個總數

myisam在統計表的總行數的時候會很快,但是有個大前提,不能加有任何where條件。這是因為:myisam對於表的行數做了優化,具體做法是有乙個變數儲存了表的行數,如果查詢條件沒有where條件則是查詢表中一共有多少條資料,myisam可以做到迅速返回,所以也解釋了如果加where條件,則該優化就不起作用了。細心的同學會發現,innodb的表也有這麼乙個儲存了錶行數的變數,但是很遺憾這個值是乙個估計值,沒有什麼實際意義。

show table status  雖然很快,但是不精準

innodb 表直接 count(*) 會遍歷全表,雖然結果準確,但是效能很差

count的定義:

count()有兩個非常不同的作用:

1.它可以統計某個列值的數量,也可以統計行數。在統計列值時要求列值是非空的(不統計null)。如果在count()的括號中定了列或者列表示式,則統計的就是這個表示式有值的結果數。

2.count()的另乙個作用是統計結果集的行數。當mysql確認括號內的表示式值不可能為空時,實際上就是在統計行數。最簡單的就是當我們使用count(*)的時候,這種情況下萬用字元*並不像我們猜想的那樣擴充套件成所有的列,實際上,他會忽略所有列而直接統計所有的行數「

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

count(1) innodb會遍歷整個表,不取值。server層放乙個數字1進去,判斷是不可能為空的,按行累加

所以:count(1) 比 count(id) 快,因為從引擎返回id會涉及到解析資料,copy字段值等操作

count(字段)來說:

如果這個欄位是定義為not null的話,一行一行讀取這個字段,判斷不能為null,按行累加

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

count(*) 是個例外,並不會把全部欄位都取出來,而是專門做了優化,不取值,count(*)肯定不是null,按行累加

結論(效能從高到低):

count(*) > count(1) >  count(id) > count(字段)

寫死總數,mis後台內部使用,本來精度要求就不高,大部分用搜尋就可以滿足了 ,簡單快捷

單獨redis計數,定時指令碼修正資料 ,簡單,存在部分誤差

mysql統計表,通過事務保證一致性,效能差,維護複雜度高

普通分頁實現  limit n,m   當n非常大時,需要遍歷大量資料,效能低下

優化方案:

改為 id>***  limit m 根據排序條件建立索引,記錄開始的位置

利用覆蓋索引,減少無效回表。

mysql的慢語句 MySQL中慢語句如何記錄?

實際工作中經常會遇到資料庫操作突然變慢的情況,但是檢查了各種硬體設施以及網路監控後發現都沒有什麼問題 這時候就要從資料庫入手了,而慢sql是我們工作中經常會遇到的影響查詢效能的情況。本文將介紹如何在mysql中獲取慢sql。一 資料庫中通過日誌記錄慢sql的幾個配置項 1.slow query lo...

mysql 慢查詢 MySQL慢查詢

一 簡介 開啟慢查詢日誌,可以讓mysql記錄下查詢超過指定時間的語句,通過定位分析效能的瓶頸,才能更好的優化資料庫系統的效能。二 引數說明 slow query log 慢查詢開啟狀態 slow query log file 慢查詢日誌存放的位置 這個目錄需要mysql的執行帳號的可寫許可權,一般...

mysql開啟慢查詢日誌 MySQL慢日誌體系建設

慢查詢日誌是mysql提供的一種日誌記錄,用來記錄在mysql中響應時間超過閾值的sql語句,在很大程度上會影響資料庫整體的效能,是mysql優化的乙個重要方向。在58的雲db平台建設中,慢sql系統作為乙個非常重要功能模組,不僅是dba日常運維使用,我們也希望通過該功能可以協助開發人員更快速定位業...