Mysql 计算一列字符串中出现多个表名的次数

Mysql 计算一列字符串中出现多个表名的次数,mysql,Mysql,我试图计算mysql.general_log表中出现几个表名的次数 例如,在mysql.general\u log表中,参数列的值如下: +------------------------------------------------------------------------------+ | argument | +------------------

我试图计算mysql.general_log表中出现几个表名的次数

例如,在
mysql.general\u log
表中,参数列的值如下:

+------------------------------------------------------------------------------+
| argument                                                                     |
+------------------------------------------------------------------------------+
| SET GLOBAL general_log = 'ON'                                                |
| SELECT * FROM TABLEB WHERE val = 1 LIMIT 0, 1000                             |
| SHOW INDEX FROM 'DB1'.'TABLEB'                                               |
| DELETE FROM TABLEC WHERE val = 1                                             |
| UPDATE TABLEC SET val2 = 5 where val = 8                                     |
| DELETE FROM TABLEA WHERE val = 1                                             |
| DELETE FROM TABLED WHERE val = 1                                             |
| SELECT COUNT(*) FROM TABLED WHERE val = 1 LIMIT 0, 1000                      |
| DELETE FROM TABLEB WHERE val = 1                                             |
| SELECT COUNT(*) FROM TABLEB LIMIT 0, 1000                                    |
| UPDATE TABLEB SET city = 'NYC' WHERE val IN (2,6)                            |
| SELECT name FROM TABLEA WHERE val IN (2,3) LIMIT 0, 1000                     |
| SHOW INDEX FROM ''DB1.'TABLEA'                                               |
| INSERT INTO TABLEB VALUES(34)                                                |
| INSERT INTO TABLEA VALUES(34)                                                |
| INSERT INTO TABLEA VALUES(34)                                                |
| COMMIT                                                                       |
| SET GLOBAL general_log = 'OFF'                                               |
+------------------------------------------------------------------------------+
然后,目标是创建一个表,该表将显示所使用的每个表的计数

|TABLE NAME| COUNTS 
| TABLEA   |  5
| TABLEB   |  5
| TABLEC   |  2
| TABLED   |  1
到目前为止,这是我能想到的最佳解决方案:

SELECT argument, COUNT (*) FROM mysql.general_log
    WHERE  argument LIKE '%TABLEA%'   OR
           argument LIKE '%TABLEB%'   OR
           argument LIKE '%TABLEC%'   OR
           argument LIKE '%TABLED%'
    GROUP BY argument ORDER BY TIMES ASC;
我还考虑过使用
信息模式.TABLES
并选择
表模式='DB1'的所有行
获取表名,如果这提供了解决方案的线索。

慢而脏的版本(非常接近您自己的建议)

除了能够按语句类型分组之外,这里的优点是mysql将规范化查询,并在表名周围使用反勾号,这样您就可以确定标识符是否完全匹配。默认情况下,MySQL不启用对此表的收集,因此您可能需要在
setup\u instruments
中启用它,并使用
--performance schema events statements history long size=a\u适当地\u large\u number
调整服务器启动时要收集的历史量


要获得可靠的解决方案,您需要一个SQL解析器。否则,您无法知道在FROM子句中是将
TABLEA
用作列前缀还是仅在字符串中使用。一种方法可能是对每个语句执行
EXPLAIN
,并从结果中提取
table
列。这无疑是一种改进,但遗憾的是,我每行的计数只有0,但获取表名无疑是一种改进,也许使用LOCATE获取字符串位置在某种程度上会有所帮助?@PatrickBornay假设您正在响应第一个示例。有点困惑,它不适合你,因为我在发布之前在本地测试了它。mysql.general_log存储在mysql数据目录下的mysql/general_log.CSV文件中,在该文件上使用grep时,您能找到任何预期的表名吗?我已经用一个不太容易找到重复答案的版本更新了答案。今天我将再试一次,我发布的表格只是示例,所以不完全相同,但可能我没有正确使用它。如果有什么问题,我将使用示例表进行尝试,看看是否得到不同的结果。但是,是的,我确实得到了表名,并且常规日志表中的arguments列确实显示了表名。格雷普也在做这件事。谢谢你的跟进,我会让你知道测试进展如何。
SELECT t.table_name, COUNT(l.argument)  
FROM information_schema.tables t 
LEFT JOIN mysql.general_log l 
  ON (l.argument REGEXP CONCAT('[[:<:]]',t.table_name,'[[:>:]]') = 1)
WHERE t.table_schema='DB1' 
GROUP BY t.table_name;
SELECT t.table_name, COUNT(l.argument)  
FROM information_schema.tables t 
LEFT JOIN mysql.general_log l 
  ON (l.argument REGEXP CONCAT('[[:<:]]',t.table_name,'[[:>:]]') = 1)
WHERE t.table_schema='onemillion' 
GROUP BY t.table_name;
+---------------+-------------------+
| table_name    | COUNT(l.argument) |
+---------------+-------------------+
| citest        |                10 |
| invoice       |                 1 |
| invoice_box   |                 0 |
| invoice_myaes |                 1 |
| item          |                 1 |
| milltest      |                 2 |
| sbtest1       |                 3 |
| sbtest1_myaes |                 3 |
| sbtest2       |                 0 |
| sbtest2_myaes |                 0 |
| users         |                 6 |
| users_myaes   |                 3 |
+---------------+-------------------+
12 rows in set (0.23 sec)
SELECT t.table_name, event_name, COUNT(e.digest_text) 
FROM information_schema.tables t
LEFT JOIN performance_schema.events_statements_history_long e 
 ON (e.digest_text LIKE CONCAT('%`',t.table_name,'`%'))
WHERE t.table_schema = 'DB1' 
GROUP BY table_name, event_name;