Как очистить / очистить буферный пул 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
Не следует доверять значению, поскольку оно является "глобальным", а не "сессионным".