tl; dr :如何获得正在运行的MySQL服务器的select语句的平均查询执行时间?
在他们的这一刻,我们有几个数据库服务器,一些从服务器被视为只读服务器。 为了有希望提高性能,我们用分区表(包含经常访问的新数据以及所决定的权力应保留在该表中的极端数量的历史数据)build立testing。
现在,我们已经基于date时间列进行了分区,在一些手动testing中,一些查询速度更快,一些查询速度更慢(显然,好的部分明确地限制了该列的结果,有些查询显然不希望)。
一切正常,似乎一切正常,在分区服务器上,然后在非分区服务器上稍微高一点的平均慢查询计数。 这是可以预料的,但是通常情况下,这些查询的优先级低于那些需要最新数据的查询。 然而客观地比较两个奴隶的performance是相当困难的。 大多数加速的查询不在慢日志中,服务器上的平均负载大致相同。
理想情况下,我想要在2个从站上的所有select查询的平均执行时间,所以我可以比较分配后是否有整体加速或降级。 在mysqlreport或者mysqladmin ext没有什么东西可以作为一个值来使用,甚至一般的查询日志都没有包含这个值。 我曾经考虑过将long_query_time为0一段时间,但是这会真的减慢服务器的速度,所以我打开其他选项,如果有的话?
你需要看看mk-query-digest
这个工具实际上可以在指定的特定时间内针对mysql运行,它将通过查询模式生成前20个查询的地图,并为您提供平均运行时间。
这是一个很棒的YouTubevideo,关于如何使用它作为一个特殊的慢日志
更新2011-07-21 15:58 EDT
我给你一个惊喜! 如果您正在使用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)
您可以通过在/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,慢日志具有列开始时间。 只有慢日志才有列query_time。