Как очистить / очистить буферный пул mysql innodb?

Я настраиваю большой запрос и хочу выполнить его с той же базовой линии до и после, для сравнения.

Я знаю о кеше запросов mysql, но он не имеет отношения ко мне, так как 2 запроса все равно не будут кэшироваться.

Кэшируются страницы innodb в пуле буферов. Есть ли способ очистить весь пул буферов, чтобы я мог сравнить два запроса с одной и той же начальной точки?

Хотя перезапуск сервера mysql после выполнения каждого запроса, несомненно, будет работать, я хотел бы избежать этого, если это возможно

2 ответа

Решение

ВНИМАНИЕ: следующее работает только для MySQL 5.5 и MySQL 5.1.41+ (плагин InnoDB)

Настройте длительность записей в пуле буферов InnoDB с этими настройками:

SET GLOBAL innodb_old_blocks_time=250; // This is 0.25 seconds
SET GLOBAL innodb_old_blocks_pct=5;
SET GLOBAL innodb_max_dirty_pages_pct=0;

Когда вы закончите тестирование, верните им значения по умолчанию:

SET GLOBAL innodb_old_blocks_time=0;
SET GLOBAL innodb_old_blocks_pct=37;
SET GLOBAL innodb_max_dirty_pages_pct=90; // 75 for MySQL 5.5/MySQL 5.1 InnoDB Plugin

Проверьте определение этих настроек

Намного проще... Запустите это дважды

SELECT SQL_NO_CACHE ...;

И посмотрите на второй тайминг.

Первый разогревает buffer_pool; второй избегает КК, имея SQL_NO_CACHE,

Таким образом, второй тайминг является хорошим показателем того, сколько времени требуется в производственной системе с горячим кэшем.

Далее, посмотрите на количество обработчиков

FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handlers%';

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

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

Эта техника Handler непроницаема для того, что еще происходит; это дает последовательные результаты.

"Handler_write" указывает, что таблица tmp была необходима.

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

Если вы сделаете сброс в buffer_pool, вы можете наблюдать за изменениями в Innodb_buffer_pool_reads дать точное (?) количество прочитанных страниц в холодной системе. Это будет включать не листовые индексные страницы, которые почти всегда кэшируются. Если что-то еще происходит в системе, это STATUS Не следует доверять значению, поскольку оно является "глобальным", а не "сессионным".

Другие вопросы по тегам