Назад | Перейти на главную страницу

Получить среднее время выполнения всех выбранных запросов

tl; dr: Как я могу получить среднее время выполнения запроса для операторов выбора работающего сервера MySQL?

На данный момент у нас есть несколько серверов баз данных, некоторые из которых считаются серверами только для чтения. Чтобы надеяться на повышение производительности, мы создали тест с многораздельной таблицей (которая содержит часто используемые новые данные и огромное количество исторических данных, которые, по мнению властей, должны оставаться в этой таблице).

Теперь мы разбили на разделы на основе столбца datetime, и в некоторых ручных тестах некоторые запросы выполняются быстрее, некоторые медленнее (очевидно, поскольку хорошая часть явно ограничивает результат для этого столбца, а некоторые запросы явно не хотят, чтобы это ).

Все в порядке, похоже, все работает, но количество медленных запросов на многораздельном сервере немного выше среднего, чем на несекционированном. Этого и следовало ожидать, но обычно эти запросы также имеют более низкий приоритет, чем те, которые делать хочу самые свежие данные. Однако довольно сложно объективно сравнить производительность двух ведомых устройств. Большинство ускоренных запросов изначально не было в медленном журнале, средняя нагрузка на серверы примерно такая же и т. Д.

В идеале мне нужно среднее время выполнения всех запросов на выборку на двух подчиненных устройствах, чтобы я мог сравнить, есть ли общее ускорение или ухудшение после разделения. В mysqlreport или mysqladmin ext ничего не появляется в качестве значения, которое я мог бы использовать для этого, и даже общий журнал запросов, похоже, не содержит этого. Я думал о настройке long_query_time на время 0, но это действительно замедлит работу серверов, поэтому я открыт для других вариантов, если они есть?

Вам нужно изучить мк-запрос-дайджест

Этот инструмент может фактически работать с 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, а в медленном журнале - время начала столбца. Только в медленном журнале есть столбец query_time.