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