You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计mysql.general_log中各目标表名的出现次数?

统计MySQL通用日志中各表的操作次数

首先,你的现有SQL语句核心问题是按argument分组,这会统计每条SQL语句的重复次数,而非每个表的总操作次数。下面给出从基础到优化的完整解决方案:

基础方案:手动指定表名统计

如果已经明确要统计的表名,用UNION ALL分别统计每个表的出现次数再合并,就能得到你期望的结果:

SELECT 'TABLEA' AS `TABLE NAME`, COUNT(*) AS COUNTS
FROM mysql.general_log
WHERE argument LIKE '%TABLEA%'
UNION ALL
SELECT 'TABLEB' AS `TABLE NAME`, COUNT(*) AS COUNTS
FROM mysql.general_log
WHERE argument LIKE '%TABLEB%'
UNION ALL
SELECT 'TABLEC' AS `TABLE NAME`, COUNT(*) AS COUNTS
FROM mysql.general_log
WHERE argument LIKE '%TABLEC%'
UNION ALL
SELECT 'TABLED' AS `TABLE NAME`, COUNT(*) AS COUNTS
FROM mysql.general_log
WHERE argument LIKE '%TABLED%'
ORDER BY COUNTS DESC;

这个查询会直接输出「表名-操作次数」的统计结果,按次数降序排列。

优化方案:动态获取指定库的表名统计

如果要自动统计DB1库下的所有表,无需手动维护表名列表,可以结合information_schema.TABLES生成动态SQL来实现:

-- 生成动态统计SQL
SELECT GROUP_CONCAT(
  CONCAT(
    "SELECT '", TABLE_NAME, "' AS `TABLE NAME`, COUNT(*) AS COUNTS FROM mysql.general_log WHERE argument LIKE '%", TABLE_NAME, "%'"
  ) SEPARATOR " UNION ALL "
) INTO @sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB1';

-- 执行动态SQL
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这段代码会自动遍历DB1库的所有表,生成对应的统计语句并执行,省去了手动添加表名的麻烦。

进阶优化:更精准的表名匹配(避免误统计)

上面的LIKE '%表名%'可能会误匹配到SQL中作为字符串出现的表名(比如SELECT 'TABLEA' FROM dual),如果需要更精准的统计,可以用正则表达式匹配SQL关键字后的表名:

SELECT GROUP_CONCAT(
  CONCAT(
    "SELECT '", TABLE_NAME, "' AS `TABLE NAME`, COUNT(*) AS COUNTS FROM mysql.general_log WHERE argument REGEXP '(FROM|INTO|UPDATE|DELETE|SHOW INDEX FROM)\\s+([`'']?", TABLE_NAME, "[`'']?)'"
  ) SEPARATOR " UNION ALL "
) INTO @sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'DB1';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

这个正则会匹配FROM/INTO/UPDATE/DELETE等操作关键字后的表名(支持带反引号或单引号的表名),大幅降低误统计概率。

注意事项

  1. 性能影响:mysql.general_log通常数据量较大,直接查询可能影响数据库性能。建议先将日志数据导出到临时表,再在临时表上统计:
    CREATE TEMPORARY TABLE temp_general_log SELECT * FROM mysql.general_log;
    -- 然后在temp_general_log上执行上述统计语句
    
  2. 日志开启状态:确保general_log处于开启状态,否则无法获取操作日志。可以用SET GLOBAL general_log = 'ON';开启(重启后会失效,需在配置文件中持久化)。

内容的提问来源于stack exchange,提问作者Patrick Bornay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:17