在工作過程中,時不時會有開發諮詢幾種select count()的區別,我總會告訴他們使用select count(*) 就好。下文我會展示幾種sql的執行計畫來說明為啥是這樣。
1.測試環境
os:linux
db:mysql-5.5.18
table:innodb儲存引擎
表定義如下:
2. 測試場景與分析【統計表group_message的記錄數目】
(1)select count(*)方式
(2)select count(1)方式
(3)select count(col_name)方式
分別使用
通過上述測試結果可以看到,select count(*)和select count(1)都使用了group_id這個最短的二級索引。可能有人會問為啥不用更短的主鍵索引【int型別】呢,這主要是因為innodb儲存引擎下,主鍵索引實質包含了索引和資料,掃瞄主鍵索引實際是掃瞄物理記錄,代價實質是最大的。再來看看幾種select count(col_name), count(group_id)使用了最短二級索引,因為該列就是索引列;而count(user_id)則使用了組合索引,由於user_id實質不能利用該索引,但掃瞄索引也能得到記錄數,而且比掃瞄物理記錄代價小,這裡應該是mysql的乙個優化;count(col_null)則不能使用索引,因為該列含有null值,所以效率最低。另外,對於該列為null值的行,count(col_null)實際不會統計,這會與你想統計表記錄數目的初衷不符,比如測試表有852226條記錄,但col_null列只有1行非空,則統計結果如下:
3.測試結論
mysql中,需要通過selct count 統計表記錄數目時,使用count(*)或count(1)就好。
mysql技巧之select count的比較
在工作過程中,時不時會有開發諮詢幾種select count 的區別,我總會告訴他們使用select count 就好。下文我會展示幾種sql的執行計畫來說明為啥是這樣。1.測試環境 os linux db mysql 5.5.18 table innodb儲存引擎 表定義如下 2.測試場景與分析 ...
mysql技巧 MySQL技巧
一 儲存引擎 儲存引擎是mysql資料庫的核心 心臟 發動機,它決定了資料如何儲存,查詢的時候如何搜尋資料,索引如何建立等等 是對於資料庫檔案的一種訪問機制,如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。常用儲存引擎 innodb 1.事務處理 回滾 崩潰修復能力...
mysql 學習之 常用SQL技巧
1.檢索包含最大 最小值的行 min distinct expr max distinct expr 2.巧用rand rand n 提取隨機行 orderbyrand 同limit的結合可以從一組列中選擇隨機樣本 3.利用group by的with rollup子句做統計 當你使用rollup時,...