最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中COUNT函數(shù)的使用小結(jié)

 更新時(shí)間:2025年12月11日 10:24:24   作者:AA-代碼批發(fā)V哥  
在MySQL的數(shù)據(jù)統(tǒng)計(jì)場(chǎng)景中,COUNT()函數(shù)是使用率極高的工具,無(wú)論是統(tǒng)計(jì)表中記錄總數(shù),還是按條件聚合計(jì)數(shù),它都能輕松勝任,下面就來(lái)詳細(xì)的介紹一下

前言

COUNT()函數(shù)是使用率極高的工具,無(wú)論是統(tǒng)計(jì)表中記錄總數(shù),還是按條件聚合計(jì)數(shù),都能輕松勝任。但你是否真正了解COUNT()的底層邏輯?不同參數(shù)下的性能差異如何?本文我將從原理、用法、優(yōu)化策略等維度深度解析,幫助開(kāi)發(fā)者避免常見(jiàn)誤區(qū),寫(xiě)出高效的統(tǒng)計(jì)語(yǔ)句。

一、核心語(yǔ)法與參數(shù)差異

  • 基礎(chǔ)語(yǔ)法
COUNT(expr) -- 統(tǒng)計(jì)滿足條件的expr非NULL值的數(shù)量
COUNT(*)   -- 統(tǒng)計(jì)符合條件的記錄總數(shù)(包括全NULL行)
  • 參數(shù)類(lèi)型對(duì)比
參數(shù)形式含義說(shuō)明性能表現(xiàn)
COUNT(*)統(tǒng)計(jì)所有行(包括值為 NULL 的列),不忽略任何行受索引影響較小
COUNT(字段)統(tǒng)計(jì)該字段非 NULL 值的數(shù)量,會(huì)忽略字段值為 NULL 的行依賴(lài)字段是否有索引
COUNT(1)等價(jià)于 COUNT (),統(tǒng)計(jì)所有行,1 為常量表達(dá)式,執(zhí)行效率與 COUNT () 基本一致與 COUNT (*) 相同
-- 表結(jié)構(gòu):users(id INT, name VARCHAR(50), age INT)
-- 統(tǒng)計(jì)總記錄數(shù)(包含name為NULL的行)
SELECT COUNT(*) FROM users; 

-- 統(tǒng)計(jì)age非NULL的記錄數(shù)
SELECT COUNT(age) FROM users; 

-- 與COUNT(*)等價(jià),寫(xiě)法更直觀
SELECT COUNT(1) FROM users; 

二、COUNT (*) 的執(zhí)行原理與索引影響

  • 無(wú)索引場(chǎng)景
    當(dāng)表未創(chuàng)建任何索引時(shí),COUNT(*)會(huì)觸發(fā)全表掃描(ALL訪問(wèn)類(lèi)型),逐行統(tǒng)計(jì)記錄數(shù)。此時(shí)性能取決于表數(shù)據(jù)量,百萬(wàn)級(jí)數(shù)據(jù)可能出現(xiàn)明顯延遲。
  • 有索引場(chǎng)景
    普通索引: 若存在非唯一普通索引(如idx_name),MySQL 會(huì)選擇成本最低的索引進(jìn)行掃描(INDEX訪問(wèn)類(lèi)型),通過(guò)遍歷索引樹(shù)統(tǒng)計(jì)行數(shù)。由于索引通常比數(shù)據(jù)文件小,性能優(yōu)于全表掃描。
    主鍵索引: COUNT(*)在有主鍵時(shí)會(huì)優(yōu)先使用主鍵索引(PRIMARY訪問(wèn)類(lèi)型),因?yàn)橹麈I索引包含完整的行數(shù)據(jù),統(tǒng)計(jì)效率更高。
-- 查看執(zhí)行計(jì)劃
EXPLAIN SELECT COUNT(*) FROM users;
-- 輸出結(jié)果中Key列顯示使用的索引(如PRIMARY、idx_name)

三、COUNT (字段) 的執(zhí)行邏輯與常見(jiàn)誤區(qū)

1.字段為 NULL 的處理

  • 當(dāng)字段值為 NULL 時(shí),COUNT(字段)會(huì)忽略該行,只統(tǒng)計(jì)非 NULL 值的數(shù)量。
  • 誤區(qū):認(rèn)為COUNT(字段)與COUNT(*)結(jié)果一致,需注意字段是否允許 NULL 值。

2.索引對(duì) COUNT (字段) 的影響

  • 字段為主鍵 / 唯一索引
    此時(shí)COUNT(字段)等價(jià)于COUNT(*),因?yàn)橹麈I / 唯一鍵不允許 NULL,且索引查詢(xún)效率高。
  • 字段為普通索引且允許 NULL
    MySQL 會(huì)掃描索引樹(shù),過(guò)濾掉 NULL 值后統(tǒng)計(jì)數(shù)量。若字段大量為 NULL,索引掃描范圍更小,性能可能優(yōu)于COUNT(*)。
  • 字段無(wú)索引
    全表掃描逐行判斷字段是否為 NULL,性能較差,需避免在大表中使用。

四、性能優(yōu)化策略與最佳實(shí)踐

1.根據(jù)場(chǎng)景選擇參數(shù)

需求場(chǎng)景推薦寫(xiě)法理由
統(tǒng)計(jì)總行數(shù)(含 NULL 行)COUNT(*)主鍵索引下效率最高
統(tǒng)計(jì)非 NULL 字段數(shù)量COUNT(字段)若字段有索引且非 NULL 比例高,效率優(yōu)于 COUNT (*)
兼容舊版或習(xí)慣寫(xiě)法COUNT(1)邏輯清晰,執(zhí)行效率與 COUNT (*) 一致

2.利用索引加速

  • 必選操作:對(duì)大表的COUNT(*)查詢(xún),確保存在主鍵或合適的普通索引。
  • 覆蓋索引優(yōu)化:若同時(shí)需要統(tǒng)計(jì)和過(guò)濾條件,可創(chuàng)建包含查詢(xún)條件的覆蓋索引:
-- 場(chǎng)景:統(tǒng)計(jì)status=1的訂單數(shù)
CREATE INDEX idx_status ON orders(status);
SELECT COUNT(*) FROM orders WHERE status=1; -- 使用idx_status索引

3.避免全表掃描

  • 禁止在無(wú)索引的大表中使用COUNT(*)或COUNT(字段)。
  • 定期分析表結(jié)構(gòu),為高頻統(tǒng)計(jì)字段添加索引(如時(shí)間字段、狀態(tài)字段)。

4.大表統(tǒng)計(jì)的終極方案

對(duì)于千萬(wàn)級(jí)以上數(shù)據(jù)量的表,建議采用以下方案:

  • 異步統(tǒng)計(jì):通過(guò)定時(shí)任務(wù)或消息隊(duì)列,將統(tǒng)計(jì)結(jié)果緩存到 Redis 或獨(dú)立計(jì)數(shù)表。
  • 分表統(tǒng)計(jì):按時(shí)間或范圍分表,統(tǒng)計(jì)時(shí)合并各子表結(jié)果。
  • 使用近似算法:若允許一定誤差,可使用HYPERLOGLOG數(shù)據(jù)結(jié)構(gòu)(MySQL 8.0 + 支持):
CREATE TABLE visit_stats (
    day DATE PRIMARY KEY,
    uv HLL
);
-- 統(tǒng)計(jì)日活(近似值)
SELECT HLL_COUNT(uv) FROM visit_stats WHERE day='2023-10-01';

五、常見(jiàn)問(wèn)題

  • COUNT (*) 與 COUNT (1) 的性能差異?
    本質(zhì)上完全等價(jià),MySQL 優(yōu)化器會(huì)將兩者視為相同操作,執(zhí)行計(jì)劃和耗時(shí)一致。
  • 為什么 COUNT (字段) 比 COUNT () 快?
    當(dāng)字段為非 NULL 且有索引時(shí),COUNT(字段)只需掃描索引樹(shù),無(wú)需訪問(wèn)數(shù)據(jù)行;而COUNT()可能需要回表(若使用非聚集索引)。
  • 如何統(tǒng)計(jì)某字段的唯一值數(shù)量?
    使用COUNT(DISTINCT 字段),但需注意:
    1)對(duì)大字段(如文本)使用時(shí)可能觸發(fā)臨時(shí)表,導(dǎo)致性能下降;
    2)可通過(guò)索引優(yōu)化(如創(chuàng)建前綴索引)或分桶處理優(yōu)化。

總結(jié)

COUNT()函數(shù)看似簡(jiǎn)單,實(shí)則暗藏諸多性能細(xì)節(jié):

  • 優(yōu)先使用COUNT(*)統(tǒng)計(jì)總行數(shù),并確保表存在主鍵或合適索引;
  • COUNT(字段)適用于非 NULL 值統(tǒng)計(jì),需結(jié)合字段索引和 NULL 值比例選擇;
  • 大表場(chǎng)景必須避免全表掃描,通過(guò)索引優(yōu)化、異步統(tǒng)計(jì)等方案提升效率;
  • 理解執(zhí)行計(jì)劃(EXPLAIN)是優(yōu)化的關(guān)鍵,關(guān)注Key和Rows字段判斷索引使用情況。

掌握這些要點(diǎn),能讓你在數(shù)據(jù)統(tǒng)計(jì)場(chǎng)景中寫(xiě)出高效、穩(wěn)定的 SQL 語(yǔ)句。

到此這篇關(guān)于MySQL中COUNT函數(shù)的使用小結(jié)的文章就介紹到這了,更多相關(guān)MySQL COUNT函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL慢查詢(xún)SQL優(yōu)化方式

    MySQL慢查詢(xún)SQL優(yōu)化方式

    這篇文章主要介紹了MySQL慢查詢(xún)SQL優(yōu)化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理

    MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理

    這篇文章主要介紹了MySQL中MVCC機(jī)制的實(shí)現(xiàn)原理,MVCC多版本并發(fā)控制,MySQL中一種并發(fā)控制的方法,他主要是為了提高數(shù)據(jù)庫(kù)的讀寫(xiě)性能,用更好的方式去處理讀寫(xiě)沖突
    2022-08-08
  • Mysql如何查詢(xún)鎖表

    Mysql如何查詢(xún)鎖表

    這篇文章主要介紹了Mysql如何查詢(xún)鎖表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Sysbench對(duì)Mysql進(jìn)行基準(zhǔn)測(cè)試過(guò)程解析

    Sysbench對(duì)Mysql進(jìn)行基準(zhǔn)測(cè)試過(guò)程解析

    這篇文章主要介紹了Sysbench對(duì)Mysql進(jìn)行基準(zhǔn)測(cè)試過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • mysql 8.0.12 安裝配置方法圖文教程(windows10)

    mysql 8.0.12 安裝配置方法圖文教程(windows10)

    這篇文章主要為大家詳細(xì)介紹了windows10下mysql 8.0.12 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • mysql中find_in_set函數(shù)的基本使用方法

    mysql中find_in_set函數(shù)的基本使用方法

    這篇文章主要給大家介紹了關(guān)于mysql中find_in_set函數(shù)的基本使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫(kù)中的幾種方法

    將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫(kù)中的幾種方法

    今天小編就為大家分享一篇關(guān)于將圖片儲(chǔ)存在MySQL數(shù)據(jù)庫(kù)中的幾種方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 詳解mysql 中的鎖結(jié)構(gòu)

    詳解mysql 中的鎖結(jié)構(gòu)

    這篇文章主要介紹了mysql 中的鎖結(jié)構(gòu)的相關(guān)資料,幫助大家更好的理解和使用數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-10-10
  • Win2008 R2 mysql 5.5 zip格式mysql 安裝與配置

    Win2008 R2 mysql 5.5 zip格式mysql 安裝與配置

    這篇文章主要介紹了Win2008 R2 mysql 5.5 zip格式mysql 安裝與配置,需要的朋友可以參考下
    2017-06-06
  • MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解

    MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解

    這篇文章主要為大家介紹了MySQL服務(wù)啟動(dòng)與關(guān)閉如何操作圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-10-10

最新評(píng)論

泽普县| 万山特区| 海丰县| 正镶白旗| 翁源县| 剑河县| 库伦旗| 滦南县| 江口县| 喀喇| 宿迁市| 湘乡市| 香格里拉县| 莒南县| 延边| 娱乐| 鹿泉市| 余庆县| 涪陵区| 涟源市| 获嘉县| 六枝特区| 华宁县| 丹巴县| 双峰县| 兴国县| 绥中县| 襄汾县| 苍南县| 东阿县| 淮北市| 延庆县| 盐源县| 徐汇区| 阳原县| 九龙县| 赣州市| 闻喜县| 祁东县| 友谊县| 察哈|