LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

count(1) 和 count(*)哪個性能更好?

liguoquan
2024年11月29日 10:16 本文熱度 914
:count(1) 和 count(*)哪個性能更好?


在數據庫查詢中,count(*) 和 count(1) 是兩個常見的計數表達式,都可以用來計算表中行數。

很多人都以為 count(*) 效率更差,主要是因為在早期的數據庫系統中,count(*) 可能會被實現為對所有列進行掃描,而 count(1) 則可能只掃描單個列。

但事實真是如此嗎?

執行原理

先來看看這兩者的執行原理:

count(*) 查詢所有滿足條件的行,包括包含空值的行。在大多數數據庫中,count(*) 會直接統計行數,并不會實際去讀取每行中的詳細數據,因為數據庫引擎會自行優化該計數操作,以提高執行效率。

count(1) 也是計算表中的行數,這里的 1 是一個常量,只是作為一個占位符,并沒有實際的含義。與 count(*) 類似,數據庫引擎也會對 count(1) 進行優化,以快速確定表中的行數。

count(*) 和 count(1) 的 性能差異

再說性能,在大多數數據庫中,其實 count(*)count(1) 的性能非常相似,甚至可以說沒有區別,這是因為大多數數據庫引擎對這兩種計數方式進行相同的優化,并沒有明顯的執行效率上的差異。但是在特殊情況下可能會有細微的差異,造成這種差異的原因通常有以下幾種:

1. 數據庫引擎的差異

不同的數據庫引擎可能對 count(*)count(1) 采取不同的優化策略,這在某些情況下可能會導致兩種計數方式的性能差異。例如:

  • SQL Server:在某些版本的 SQL Server 中,count(1) 在特定的查詢計劃中可能稍微快一些,但這種差異通常微乎其微,只有在處理非常大的表或復雜查詢時才會顯現出來。
  • MyISAM 引擎:在不附加任何 WHERE 查詢條件的情況下,統計表的總行數會非???,因為 MyISAM 會用一個變量存儲表的行數。如果沒有 WHERE 條件,查詢語句將直接返回該變量值,使得速度很快。然而,只有當表的第一列定義為 NOT NULL 時,count(1) 才能得到類似的優化。如果有 WHERE 條件,則該優化將不再適用。
  • InnoDB 引擎:盡管 InnoDB 表也存儲了一個記錄行數的變量,但遺憾的是,這個值只是一個估計值,并無實際意義。在 Innodb 引擎下, count(*)count(1) 哪個快呢?結論是:這倆在高版本的 MySQL 是沒有什么區別的,也就沒有 count(1) 會比 count(*) 更快這一說了。

另外,還有一個問題是 Innodb 是通過主鍵索引來統計行數的嗎?

如果該表只有一個主鍵索引,沒有任何二級索引的情況下,那么 count(*)count(1) 都是通過通過主鍵索引來統計行數的。

如果該表有二級索引,則 count(*)count(1) 都會通過占用空間最小的字段的二級索引進行統計。

2. 索引的影響

如果表上有合適的索引,無論是count(1) 還是 count(*) 都可以利用索引來快速確定行數,而不必掃描整個表。在這種情況下,兩者的性能差異通??梢院雎圆挥?。例如,如果有一個基于主鍵的索引,數據庫可以快速通過索引確定表中的行數,而無需讀取表中的每一行數據。

實戰分析

話不多說,下面我們通過實驗來驗證上述理論:

第一步:創建表與插入數據

用 Chat2DB 給我們生成一個創建表的 sql 語句,直接用自然語言描述我們想要的字段名和字段類型即可生成建表語句,也可以生成測試數據。

然后用存儲過程向 student 表中插入兩萬條測試數據。(存儲過程執行兩次)

插入數據后的 student 表如下:

這個時候執行 select count(*) from studentselect count(1) from student 可以看到解釋器的結果如下,耗時均為 2 ms(兩者一致,所以就只截了一張圖),兩者都用主鍵索引進行行數的統計:

第二步:執行計數查詢

創建二級索引 IDCard 進行統計結果如下:

可以看出用二級索引進行統計的解釋器結果還是一致。

結論

綜上所述,count(1)count(*) 的性能基本相同,并不存在 COUNT(1)COUNT(*) 更快的說法??傮w而言,在大多數情況下,兩者之間的性能差異是可以忽略不計的。

在選擇使用哪種方式時,應當優先考慮代碼的可讀性和可維護性。count(*) 在語義上更為明確,表示計算所有行的數量,而不依賴于任何特定的值。因此,從代碼清晰度的角度出發,通常建議優先使用 count(*)

當然,如果在特定的數據庫環境中,經過實際測試發現 count(1) 具有明顯的性能優勢,那么也可以選擇使用 count(1)。但在一般情況下,不必過分糾結于這兩種計數方式之間的性能差異。

希望本文能幫助你在使用計數操作時作出更為合理的選擇。


作者:Chat2DB
鏈接:https://juejin.cn/post/7417521775587065907
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
?

該文章在 2024/11/29 10:16:07 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲精品视频中文 | 午夜福到在线a国产4视频 | 亚洲熟女久久国产 | 亚洲日韩中文字综合Av | 日韩乱偷区自中文 | 亚洲乱码国产乱码精品精98 |