SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

最近看了一篇文章,講了一大堆,最後得出一些結論。說是在某種情況下,怎麼寫速度最快。但是自己去實際驗證的時候,其實並不是他說的那樣,實踐出真知,所以自己就把測試的數據整理一下,看看到底哪種情況最快?

一、他們之間的區別

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(列名)到底那個更快呢?

count(1)的執行計劃

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

count(policyId)的執行計劃

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

count(orderNo)的執行計劃

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

count(totalPremium)的執行計劃

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

count(contEndDate)的執行計劃

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

通過執行計劃,我們知道

count(*)、count(1)、count(policyId)和count(orderNo)的執行計劃是一樣的。

count(totalPremium)和count(contEndDate)的執行計劃是一樣的。

三、實踐結果

我們通過一張有24萬數據的表測試一下他們的性能,正常情況生產環境表都是有主鍵,所以就不考慮無主鍵的情況了。

40次統計結果如下

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

SQL語句中count(*)、count(1)和count(列名)到底那個更快呢?

通過上面的結果分析,我們可以得到下面的幾個結論:

1、count(*)和count(1)查詢速度幾乎沒有差別,是最快的。

2、count(*)和count(1)的查詢速度比根據主鍵或者索引查詢快。

3、根據主鍵查詢比根據索引查詢快,但是時間差別不大。

4、根據主鍵查詢count(policyId)速度快於根據普通列查詢數據。

5、表結構前面字段的查詢速度,和通過後面字段的查詢速度差別不大。(相差17個字段)

上面是mysql數據的結果,可能不同的版本、不同的數據庫、不同的數據量或者不同的表結構及索引對結果會有一定的影響,有待繼續驗證。

但是可以肯定的是根據count(*)或者count(1)查詢應該是最優方案。

四、擴展

表結構沒有主鍵,但是有索引列,索引列可以為空,這種情況最快的查詢是那種呢?

速度應該是count(索引列)最快的。因為索引列可以為空,count(*)和count(索引列)的結果是不一樣的,這裡不做比對了,個人可以去驗證下查詢速度。

喜歡的話,可以關注“莫非技術棧”,各種學習資料免費送~


分享到:


相關文章: