Відповідь Вікі спільноти, сформована з коментарів до питання Реймонда Ніланд
Використовуйте 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.