Деоптимизация MySQL

#mysql

#mysql

Вопрос:

Есть ли простая команда, которая позволит мне настроить экземпляр базы данных MySQL для работы медленнее, чем обычно?

Я работаю над кодом, который записывает и воспроизводит взаимодействия с базой данных. Одна из вещей, которые он делает, — это отслеживает, сколько времени требуется для выполнения данного запроса / команды, и если он выполняется существенно медленнее во время воспроизведения, он выдает предупреждение. Конечно, если вы не протестируете это, это не сработает; Я пытаюсь придумать автоматический тест для этой функции. Могу ли я что-то сделать с моей тестовой базой данных, что приведет к снижению производительности? Все, что мне нужно сделать, это надежно добавить 2 миллисекунды к любому заданному запросу, и все готово.

Комментарии:

1. Код, который вы пишете на MySQL, или он на каком-то другом языке и просто просматривает вашу базу данных?

2. Это Perl-код, работающий с базой данных MySQL.

Ответ №1:

Если вы просто хотите протестировать длинные запросы, сделайте это: SELECT SLEEP(1);

Не должно иметь значения, каков сам запрос, если все, что вы хотите сделать, это проверить, работает ли ваше определение продолжительности.

(Я знаю, что это нарушает истинный аспект «воспроизведения», но добавить SLEEP(1) во время «воспроизведения» к некоторым операторам select должно быть тривиально.)

Редактировать:

Вторая идея, которая, возможно, вам понравится больше: создайте блокировку таблицы из другого соединения. Запустите скрипт. Подожди немного. Снимите эту блокировку. Это не потребует вмешательства ни в один из ваших запросов к воспроизведению.

Комментарии:

1. Чувак. Все, что мне нужно сделать, это создать фиктивный файл воспроизведения, чтобы утверждать, что SELECT SLEEP(1); для выполнения должна потребоваться всего одна миллисекунда, и это даст мне поведение, которое я ищу каждый раз. Похоже, это именно то, что мне нужно. Блестящая галочка будет у вас, как только я запущу тест. Спасибо!

2. … и если по какой-то причине это не сработает, решение для бесплатной блокировки выглядит почти так же аппетитно.

3. @BlairHippo, тогда это должно работать достаточно хорошо. Посмотрите мою правку, если вам нужно решение, которое не включает в себя такие хитрости. (Редактировать: как это выглядит у вас сейчас.)

Ответ №2:

Базовая процедура, подобная этой:

  1. начать транзакцию

  2. делайте свои sql-файлы

  3. переход в спящий режим 2 мс в perl или sql

  4. фиксация

ключевым моментом является часть begin / commit: она сохранит все блокировки, которые вы приобрели, делая работу настолько медленно, насколько вы хотите.

Другой тест для рассмотрения:

  1. начать транзакцию в двух процессах

  2. выполните свой SQL-материал в первом процессе

  3. выполните свой SQL-материал во втором процессе

  4. добавляйте больше SQL-данных в каждый процесс

  5. фиксируйте каждый процесс