总结:如何获取正在运行的 MySQL 服务器的选择语句的平均查询执行时间?
目前,我们拥有多台数据库服务器,其中一些从服务器被视为只读服务器。为了提高性能,我们设置了一个分区表测试(其中包含经常访问的新数据,以及当局决定应保留在该表中的大量历史数据)。
现在,我们已经根据日期时间列进行了分区,在一些手动测试中,有些查询更快,有些查询更慢(显然,因为很大一部分明确限制了该列的结果,而有些查询明确不想要这样)。
一切正常,一切似乎都正常,分区服务器上的慢查询数量略高于非分区服务器上的平均慢查询数量。这是意料之中的,但通常这些查询的优先级也低于做想要最新的数据。然而,客观地比较两个从服务器之间的性能非常困难。大多数加速的查询一开始并不在慢速日志中,服务器上的平均负载大致相同等等。
理想情况下,我希望获得 2 个从属服务器上所有选择查询的平均执行时间,这样我就可以比较分区后总体速度是加快了还是降低了。我可以使用的值是“In”mysqlreport
或mysqladmin ext
“nothing”,甚至通用查询日志似乎也不包含这个值。我考虑过将 for 设置为long_query_time
0 一段时间,但这确实会降低服务器速度,所以我愿意考虑其他选项,如果有的话?
答案1
你需要调查mk-查询-摘要
该工具实际上可以在您指定的特定时间内针对 mysql 运行,它将根据查询模式生成前 20 个查询的地图并为您提供平均运行时间。
这是一个很棒的 YouTube 视频,介绍了如何将其用作临时慢速日志
更新时间:2011-07-21 15:58 EDT
我有一个惊喜要告诉你!!!如果你使用的是 MySQL 5.1,你可以将通用日志和慢速日志转换为表。我现在正在为一个大客户使用它。以下是具体操作方法:
在 mysql 模式中,有表 general_log 和 slow_log。
mysql> show create table mysql.general_log\G
*************************** 1. row ***************************
Table: general_log
Create Table: CREATE TABLE `general_log` (
`event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`user_host` mediumtext NOT NULL,
`thread_id` int(11) 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'
1 row in set (0.05 sec)
mysql> show create table mysql.slow_log\G
*************************** 1. row ***************************
Table: slow_log
Create Table: 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
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'
1 row in set (0.11 sec)
您可以通过在 /etc/my.cnf 中设置来激活它们的使用
[mysqld]
log-output=TABLE
当然,谁想要一个用于一般日志和慢速日志的 CSV 文件???惊喜:将它们转换为 MYISAM 并为每个条目的时间添加索引!
SET @old_log_state = @@global.slow_query_log;
SET GLOBAL slow_query_log = 'OFF';
ALTER TABLE mysql.slow_log ENGINE = MyISAM;
ALTER TABLE mysql.slow_log ADD INDEX (start_time);
SET GLOBAL slow_query_log = @old_log_state;
SHOW CREATE TABLE mysql.slow_log\G
SET @old_log_state = @@global.general_log;
SET GLOBAL general_log = 'OFF';
ALTER TABLE mysql.general_log ENGINE = MyISAM;
ALTER TABLE mysql.general_log ADD INDEX (event_time);
SET GLOBAL slow_query_log = @old_log_state;
请注意,一般日志有 event_time 列,慢速日志有 start time 列,只有慢速日志有 query_time 列。