如何统计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等操作关键字后的表名(支持带反引号或单引号的表名),大幅降低误统计概率。
注意事项
- 性能影响:
mysql.general_log通常数据量较大,直接查询可能影响数据库性能。建议先将日志数据导出到临时表,再在临时表上统计:CREATE TEMPORARY TABLE temp_general_log SELECT * FROM mysql.general_log; -- 然后在temp_general_log上执行上述统计语句 - 日志开启状态:确保
general_log处于开启状态,否则无法获取操作日志。可以用SET GLOBAL general_log = 'ON';开启(重启后会失效,需在配置文件中持久化)。
内容的提问来源于stack exchange,提问作者Patrick Bornay
相关产品推荐
相关产品推荐

