相信很多小夥伴都想了解 count(1) 和 count(*) 的性能問題 ,今天給大家做一下測試。
聲明:本文使用MySql資料庫,資料庫表裡面有100萬條資料。
先測試 count(*)

可以看出,count(*) 用時間差不多15s.
再測試 count(1)
看到這個資料,我知道很多小夥伴還是找不到心裡的答案,上面的測試會不會存在一些客觀原因,是以重新開機電腦後,重新測試一下 count(1)
這次用時34s,是不是很驚訝?
下面看看在穩定狀态下的性能對比
第一次
count(*) 5.49s
count(1) 5.11s
别着急,俗話都是三局兩勝,五局三勝。
第二次
count(*) 4.86s
count(1) 5.64s
第三次
count(*) 4.92s
count(1) 4.39s
第一個總結
從上面的比較可以看出,count(*) count(1) 在沒條件的情況下兩者沒有什麼差別。
下面使用有條件的 select 進行對比
對比了兩次,可以看出count(*) 快于count(1), 下面來解釋一下
count(1) 和count(*) 對比
如果你資料庫沒有主鍵,那麼count(1) 比count(*) 快,
如果有主鍵作為條件count(),那麼count(1) 比count(*) 快。
如果表裡面隻有一個字段,那麼還是count(*)最快
count 解釋
count(*) 傳回表中所有存在行的總數,包括null
count(1) 傳回的是去除null以外的所有行的總數,有預設值的也會被記錄
感興趣的同學,可以動手測試一下
三條經驗
這個也是好久之前在網上看到的
- 任何情況下select count(*) from table 是最優選擇
- 減少select count(*) from table where condition = ? 這樣的查詢
- 杜絕 select count(colunm) from table