首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 統計列值頻次:GROUP BY + COUNT(1) 高效寫法解析

     編輯:MySQL 資料庫相關知識

業務場景

表 material 包含 type 列(值如 'news', 'image', 'video'...),需統計每類型出現次數,且新類型自動納入統計無需改代碼。

標準解法

SELECT `type`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`;

輸出示例

+--------+-------+
| type   | count |
+--------+-------+
| news   |  1250 |
| image  |   890 |
| video  |   320 |
| audio  |    45 |
+--------+-------+

關鍵點解析

1. COUNT(1) vs COUNT(*) vs COUNT(column)

寫法語義性能推薦度
COUNT(1)統計行數(常數表達式不為 NULL)最優,優化器直接讀行指針⭐⭐⭐⭐⭐
COUNT(*)統計行數(標準 SQL)同 COUNT(1),現代優化器等價處理⭐⭐⭐⭐
COUNT(type)統計 type 非 NULL 值個數需檢查列是否 NULL,略慢⭐⭐⭐

結論:統計行數統一用 COUNT(1),語義明確且性能最優。

2. GROUP BY 自動去重聚合

  • 將相同 type 值歸為一組
  • 新增類型自動出現在結果中,無需維護代碼
  • 結果按分組列默認排序(可加 ORDER BY count DESC 按頻次降序)

3. 索引優化

ALTER TABLE `material` ADD INDEX `idx_type` (`type`);

有索引時 GROUP BY type 可走 Index Full Scan(Extra: Using index),避免臨時表 + filesort。

進階變體

多維度統計

SELECT `type`, `status`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`, `status`
ORDER BY `type`, `count` DESC;

條件過濾統計

SELECT `type`, COUNT(1) AS `count`
FROM `material`
WHERE `create_time` > '2024-01-01'
GROUP BY `type`;

分頁顯示 Top N

SELECT `type`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`
ORDER BY `count` DESC
LIMIT 10;

避坑指南

  1. 不要用子查詢統計:SELECT type, (SELECT COUNT(*) FROM material m2 WHERE m2.type=m1.type) FROM material m1 GROUP BY type 效率極低
  2. 注意 NULL 值:type 為 NULL 的行會單獨分為一組,業務上通常需 WHERE type IS NOT NULL 或 COALESCE(type, 'unknown')
  3. 大表統計近似值:百萬級以上考慮 EXPLAIN 分析或抽樣統計,避免長時間鎖表

掌握 GROUP BY + COUNT(1) 模式,即可高效解決 90% 的列值頻次統計需求,是 SQL 分析工具箱中的必備基礎招式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved