【发布时间】:2022-02-08 21:01:44
【问题描述】:
是否有存储在 MySQL 上运行的所有历史查询的表/位置?
我想对历史查询进行分析,以确定在每个表中创建什么索引。
【问题讨论】:
-
好主意,但我认为它们不会存储在任何地方。不过,通常监控工具会这样做。
标签: mysql
是否有存储在 MySQL 上运行的所有历史查询的表/位置?
我想对历史查询进行分析,以确定在每个表中创建什么索引。
【问题讨论】:
标签: mysql
您可以通过创建 slow_log 或 general_log 表来做到这一点。
MySQL 服务器提供了一种显示一般查询日志和慢查询日志的方法,如果这些日志已启用。
首先,检查 MySQL 数据库中是否已经存在 slow_log 和 general_log 这两个表。
如果您还没有它们 - 那么您必须创建它们。
确保在 MySQL 数据库中创建它们。
创建general_log 表:
CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` bigint (21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumtext NOT NULL) ENGINE = CSV DEFAULT CHARSET = utf8 COMMENT = 'General log'
一般查询日志是mysqld正在做什么的一般记录。
在那里你会找到如下信息:
对于slow_log 表:
CREATE TABLE `slow_log` (
`start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`query_time` time NOT NULL,
`lock_time` time NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumtext NOT NULL,
`thread_id` bigint (21) unsigned NOT NULL) ENGINE = CSV DEFAULT CHARSET = utf8 COMMENT = 'Slow log'
慢查询日志由执行时间超过 long_query_time 秒且需要检查 leastmin_examined_row_limit 行的 SQL 语句组成。
慢查询日志可用于查找需要很长时间执行的查询,因此是优化的候选对象(在您的情况下为索引)。
然后你需要启用它(如果你还没有启用它):
SET global general_log = 1;
SET global log_output = 'table';
现在您可以通过运行以下查询来查看日志:
SELECT * FROM mysql.general_log;
如果要禁用数据库上的查询日志记录,请运行此查询
SET global general_log = 0;
请注意,打开此功能会带来一些注意事项,例如消耗磁盘空间和类似的性能考虑,因此您可以根据需要打开和关闭它,而不是始终保持打开状态。
在此处阅读有关这些的更多信息:
【讨论】:
sql_text 的默认数据类型是 BLOB,我该如何处理?
CREATE TABLE 语句,我只是使用了 SET global general_log = 1;设置全局 log_output = '表';但是 sql_text 列使用的是 BLOB 数据类型。我无法打开它来查看它。