![SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?](http://p2.ttnews.xyz/loading.gif)
最近看了一篇文章,講了一大堆,最後得出一些結論。說是在某種情況下,怎麼寫速度最快。但是自己去實際驗證的時候,其實並不是他說的那樣,實踐出真知,所以自己就把測試的數據整理一下,看看到底哪種情況最快?
一、他們之間的區別
1、cout(*)返回表中的記錄數,行為空也會被統計。
2、count(列名)對指定列的行數進行統計,行為null不做統計。
3、count(*)和count(1)兩個函數沒有區別。通過執行計劃查看,他們的執行計劃是一樣的。
二、執行計劃腳本
select count(*) from lc_policy;
select count(1) from lc_policy;
#根據主鍵
select count(policyId) from lc_policy;
#索引列不可能空
select count(orderNo) from lc_policy;
#非主鍵列查詢(前面字段)
select count(totalPremium) from lc_policy;
#非主鍵列查詢(後面字段)
select count(contEndDate) from lc_policy;
三、執行計劃查看
cout(*)的執行計劃
![SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?](http://p2.ttnews.xyz/loading.gif)
count(1)的執行計劃
count(policyId)的執行計劃
count(orderNo)的執行計劃
count(totalPremium)的執行計劃
count(contEndDate)的執行計劃
通過執行計劃,我們知道
count(*)、count(1)、count(policyId)和count(orderNo)的執行計劃是一樣的。
count(totalPremium)和count(contEndDate)的執行計劃是一樣的。
三、實踐結果
我們通過一張有24萬數據的表測試一下他們的性能,正常情況生產環境表都是有主鍵,所以就不考慮無主鍵的情況了。
40次統計結果如下
通過上面的結果分析,我們可以得到下面的幾個結論:
1、count(*)和count(1)查詢速度幾乎沒有差別,是最快的。
2、count(*)和count(1)的查詢速度比根據主鍵或者索引查詢快。
3、根據主鍵查詢比根據索引查詢快,但是時間差別不大。
4、根據主鍵查詢count(policyId)速度快於根據普通列查詢數據。
5、表結構前面字段的查詢速度,和通過後面字段的查詢速度差別不大。(相差17個字段)
上面是mysql數據的結果,可能不同的版本、不同的數據庫、不同的數據量或者不同的表結構及索引對結果會有一定的影響,有待繼續驗證。
但是可以肯定的是根據count(*)或者count(1)查詢應該是最優方案。
四、擴展
表結構沒有主鍵,但是有索引列,索引列可以為空,這種情況最快的查詢是那種呢?
速度應該是count(索引列)最快的。因為索引列可以為空,count(*)和count(索引列)的結果是不一樣的,這裡不做比對了,個人可以去驗證下查詢速度。
喜歡的話,可以關注“莫非技術棧”,各種學習資料免費送~
閱讀更多 一個程序員的獨白 的文章