MySQL中count(*)、count(1)和count(字段名)的區(qū)別及說明
MySQL count(*)、count(1)和count(字段名)區(qū)別
MySQL中COUNT(*)
、COUNT(1)
和COUNT(字段名)
的區(qū)別:
計數(shù)類型 | 描述 | 是否計算NULL值 | 性能考慮 |
---|---|---|---|
COUNT(*) | 計算包括所有列的行數(shù) | 是,不區(qū)分列值是否為NULL | 通常最優(yōu),因為不需要檢查特定列的值 |
COUNT(1) | 功能上與COUNT(*)等價,計算行數(shù) | 是,1是一個常量,永遠不為NULL | 與COUNT(*)性能相同,因為執(zhí)行計劃通常相同 |
COUNT(字段名) | 計算指定列中非NULL值的行數(shù) | 否,只計算非NULL值的行數(shù) | 可能比COUNT(*)或COUNT(1)慢,特別是當檢查的字段包含許多NULL值時 |
在大多數(shù)情況下,COUNT(*)
是首選,因為它既符合SQL標準,又在性能上表現(xiàn)良好。
在MySQL等關系數(shù)據(jù)庫管理系統(tǒng)中,COUNT(*)
和 COUNT(1)
在功能上是等價的,它們之間的區(qū)別并不明顯,主要體現(xiàn)在以下幾個方面:
COUNT(*)、COUNT(1)有明顯區(qū)別嗎
1. 功能等價性
COUNT(*)
:計算查詢結果集中的所有行數(shù),包括所有列,不會忽略任何行,即使某些列包含NULL
值。COUNT(1)
:將1
作為一個非空的常量值,對每一行進行計數(shù)。由于1
永遠不為NULL
,因此它實際上與COUNT(*)
一樣計算所有行。
在現(xiàn)代數(shù)據(jù)庫系統(tǒng)中,COUNT(*)
和COUNT(1)
在執(zhí)行計劃中的表現(xiàn)通常相同,查詢效率基本沒有區(qū)別。
2. 語義清晰性
COUNT(*)
:語義明確,清楚地表明了計數(shù)所有行的意圖,因此更受青睞。對于閱讀代碼的人來說,它更直觀。COUNT(1)
:雖然功能上等價于COUNT(*)
,但某些開發(fā)人員可能出于個人或歷史原因更喜歡它的外觀。然而,從語義清晰性的角度來看,COUNT(*)
更勝一籌。
3. 性能差異(歷史與現(xiàn)代數(shù)據(jù)庫系統(tǒng)的對比)
- 在歷史上,某些舊版的數(shù)據(jù)庫系統(tǒng)在處理
COUNT(*)
時,可能會去解析整行數(shù)據(jù),而COUNT(1)
可以直接統(tǒng)計行數(shù),因此會有一些微小的性能差異。 - 然而,在現(xiàn)代數(shù)據(jù)庫系統(tǒng)中(如MySQL、PostgreSQL、SQL Server等),
COUNT(*)
和COUNT(1)
在性能方面處理相似。這些系統(tǒng)的優(yōu)化器理解這兩個查詢本質上是在要求相同的內(nèi)容:行計數(shù)。因此,性能差異可以忽略不計。
4. 使用建議
- 在編寫SQL查詢時,應優(yōu)先考慮代碼的可讀性和可維護性。
COUNT(*)
因其清晰和可讀性通常更受推薦。 - 除非基于對數(shù)據(jù)庫優(yōu)化器的深入理解或個人偏好(且這種偏好在現(xiàn)代數(shù)據(jù)庫系統(tǒng)中通常不會帶來性能上的顯著優(yōu)勢),否則應使用
COUNT(*)
來計數(shù)行。
綜上,COUNT(*)
和COUNT(1)
在功能上是等價的,并且在現(xiàn)代數(shù)據(jù)庫系統(tǒng)中性能差異可以忽略不計。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決sql server不支持variant數(shù)據(jù)類型的問題
在數(shù)據(jù)庫中,數(shù)據(jù)類型是非常重要的,但有時候我們可能會遇到 SQL Server 不支持的數(shù)據(jù)類型,例如 Variant,在本篇博文中,我們將探討問題的背景,提供解決思路,并總結如何解決 SQL Server 不支持 Variant 數(shù)據(jù)類型的挑戰(zhàn)2023-09-09完美解決MySQL數(shù)據(jù)庫服務器CPU飆升問題
這篇文章主要介紹了解決 MySQL 數(shù)據(jù)庫服務器 CPU 飆升的方法,包括定位問題(如使用工具監(jiān)控、查看慢查詢?nèi)罩荆?、?yōu)化 SQL 查詢、調整配置參數(shù)、優(yōu)化數(shù)據(jù)庫架構、檢查硬件資源、處理鎖競爭問題等,還通過電商業(yè)務系統(tǒng)的案例進行了詳細分析及給出解決方法,最終優(yōu)化效果顯著2025-02-02關于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法
這篇文章主要介紹了關于MySql數(shù)據(jù)庫Update批量更新不同值的實現(xiàn)方法,數(shù)據(jù)庫管理系統(tǒng)可以通過SQL管理數(shù)據(jù)庫,定義和操作數(shù)據(jù),維護數(shù)據(jù)的完整性和安全性,需要的朋友可以參考下2023-05-05Mac環(huán)境mysql5.7.21 utf8編碼問題及解決方案
本篇教程給大家簡單介紹下Mac環(huán)境mysql5.7.21 utf8編碼問題及解決方案,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-03-03