获取所有select查询的平均执行时间

Wri*_*ken 5 mysql performance-monitoring

tl;dr:如何获得正在运行的 MySQL 服务器的 select 语句的平均查询执行时间?

目前我们有几个数据库服务器,其中一些从属服务器被视为只读服务器。为了希望提高性能,我们使用分区表设置了一个测试(其中包含经常访问的新数据,以及已决定的权力应该保留在该表中的大量历史数据)。

现在,我们已经基于日期时间列进行了分区,并且在一些手动测试中,有些查询更快,有些查询更慢(显然,因为很大一部分明确限制了该列的结果,而有些查询明确不希望那样) )。

一切都很好,似乎一切正常,分区服务器上的慢查询计数略高于非分区服务器上的平均慢查询计数。这是可以预料的,但通常,这些查询也有较低的优先级,然后将那些想要的最新数据。然而,很难客观地比较 2 个从站之间的性能。大多数加速的查询一开始不在慢日志中,服务器上的平均负载大致相同等。

理想情况下,我想要 2 个从站上所有选择查询的平均执行时间,因此我可以比较分区后是否有整体加速或降级。In mysqlreportor mysqladmin extnothing 作为我可以用于此的值,甚至一般查询日志似乎都不包含此值。我已经考虑将long_query_timefor 0设置了一段时间,但这确实会减慢服务器的速度,所以我愿意接受其他选项,如果有的话?

Rol*_*DBA 4

您需要研究mk-query-digest

该工具实际上可以针对 mysql 运行您指定的特定时间长度,并且它将按查询模式生成前 20 个查询的映射,并为您提供平均运行时间。

这是一个精彩的 YouTube 视频,介绍了如何将其用作临时慢日志

更新 2011-07-21 15:58 美国东部时间

我给你一个惊喜!!!如果使用MySQL 5.1,可以将普通日志和慢日志转表。我现在正在与一个大客户一起使用它。您可以这样做:

在mysql模式中,有表general_log abd 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)
Run Code Online (Sandbox Code Playgroud)

您可以通过在 /etc/my.cnf 中设置来激活它们的使用

[mysqld]
log-output=TABLE
Run Code Online (Sandbox Code Playgroud)

当然,谁想要通用日志和慢速日志的 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;
Run Code Online (Sandbox Code Playgroud)

请注意,一般日志具有 event_time 列,慢速日志具有开始时间列。只有慢日志有 query_time 列。