Как оценить операции ввода-вывода, выполняемые запросами MySQL?

13

В Amazon RDS вы платите около 0,10 доллара за 1 миллион запросов ввода-вывода. Я заметил очень большое количество (в сотнях тысяч) запросов ввода-вывода для базы данных с очень низким трафиком. Увидев это, я провел дополнительное исследование и обнаружил, что этот вопрос описывает, что для веб-сайта с 6000 пользователей он генерирует 800 миллионов запросов ввода-вывода в месяц, что будет стоить ему около 80 долларов в месяц.

Поэтому я хочу заранее знать, сколько операций ввода-вывода сгенерирует запрос MySQL и как их оптимизировать / минимизировать. Есть ли способ оценить, сколько операций ввода-вывода будет выполнять запрос, и какие общие правила я могу соблюдать, чтобы поддерживать их как можно ниже?

Нажмите Upvote
источник

Ответы:

2

Ответ сообщества Wiki, полученный из комментариев на вопрос Раймонда Нейланда

Использование EXPLAIN. Таким образом, вы можете увидеть, МОЖЕТ ли запрос для ввода-вывода диска. Вам нужно избегать в колонке лишних «Использование временных» или «Использование временных»; Использование сортировки файлов (обратите внимание, что сортировка файлов - вводящее в заблуждение имя: если результирующий набор помещается в память, быстрая сортировка запускается в памяти) ".

Скорее всего, это вызвано подзапросами / объединениями / упорядочением / group by / ... Если у вас большой результат и создана временная таблица на диске MyISAM, и вам нужно отсортировать результат, вы сортируете результат устанавливается на основе операций чтения и ввода-вывода с использованием алгоритма быстрой сортировки.

В разделе Использование внутренней временной таблицы в MySQL вы можете прочитать, когда MySQL необходимо создать таблицу MyISAM на основе диска. Возможно, вы можете использовать строки avg_row_length * (хотя обратите внимание, что значение строки из объяснения не является точным с движком InnoDB), чтобы проверить, помещается ли результат в кучу. См. ПОКАЗАТЬ Синтаксис ТАБЛИЦЫ .

В целом лучше ли InnoDB или MyISAM избегать запросов ввода-вывода?

InnoDB будет буферизовать данные таблицы и индексировать данные, тогда как MyISAM буферизует только ключи индекса. Ввод / вывод данных таблицы необходим, когда в дополнительном столбце объяснения не указано «Использование индекса».

Если оба используют индексы: с InnoDB, если буфер горячий, он может загружать данные из памяти. Если индексы должны поступать с диска, существует формула, которую вы можете использовать для расчета необходимых операций чтения-вывода для операций выбора, вставки и обновления. Из оценки производительности запроса :

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

log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1

Индексы InnoDB больше, потому что они хранят данные из ключа PRIMARY / UNIQUE в индекс KEY. Это быстрее и требует еще меньше операций ввода-вывода, но вы можете сжать данные или индексы InnoDB.

Пол Уайт
источник