Як оцінити операції вводу / виводу, виконані за запитами MySQL?


13

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

Тому я хочу заздалегідь знати, скільки операцій вводу / виводу генерує запит MySQL та як їх оптимізувати / мінімізувати. Чи є який-небудь спосіб оцінити, скільки операцій вводу-виводу виконає запит, і яких загальних правил я можу дотримуватись, щоб вони були максимально низькими?

Відповіді:


2

Відповідь Вікі спільноти, сформована з коментарів до питання Реймонда Ніланд

Використовуйте EXPLAIN. Таким чином ви зможете побачити, чи запит МОЖЕ потребувати дискового вводу. Вам потрібно уникати в стовпчику додаткових "Використання тимчасових" або "" Використання тимчасових; Використання filesort (зауважте, що fileort є оманливою назвою: якщо набір результатів вписується в пам'ять, quicksort запускається в пам'яті) ".

Це, швидше за все, викликано підзапросами / об'єднаннями / замовленнями по / групі по / ... Якщо ваш результат великий і створюється тимчасова таблиця на основі диска MyISAM, і вам потрібно сортувати результат, ви сортуєте результат набір на основі IO зчитує, а IO пише з алгоритмом quicksort.

У розділі Внутрішня тимчасова таблиця в MySQL ви можете прочитати, коли MySQL потрібно створити таблицю MyISAM на основі диска. Можливо, ви можете використовувати avg_row_length * рядки (хоча зауважте, що значення рядків з пояснення не є точним для двигуна InnoDB), щоб перевірити, чи підходить результат у купу. Див SHOW TABLE STATUS Синтаксис .

Загалом, чи краще InnoDB або MyISAM уникнути запитів вводу / виводу?

InnoDB буде буферувати дані таблиці та дані індексу, тоді як MyISAM буферизує лише індексні ключі. Введення / виведення даних таблиці потрібне, коли додаткові стовпці пояснення не говорять "Використання індексу".

Якщо обидва використовують індекси: За допомогою InnoDB, якщо буфер гарячий, він може завантажувати дані з пам'яті. Якщо індекси повинні надходити з диска, існує формула, яку ви можете використовувати для обчислення необхідних зчитувань IO для вибору, вставок та оновлень. З оцінки ефективності запиту :

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

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

Індекси InnoDB є більшими, оскільки вони зберігають дані від ПЕРВИЧНОГО / УНІКАЛЬНОГО ключа в індекс KEY. Це швидше і потребує ще меншої кількості шукань вводу-виводу, але ви можете стискати дані або індекси InnoDB.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.