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

