Я зробив багато досліджень про те, як підтримувати індекси в MySQL, щоб запобігти фрагментації та якось оптимізувати виконання деяких запитів.
Мені знайома та формула, яка обчислює відношення між максимальним простором, доступним для таблиці VS, простором, використовуваним даними та індексами.
Однак мої основні питання досі не відповіді. Можливо, це пов'язано з тим, що я знайомий із підтримкою індексу в SQL Server, і я схильний вважати, що в MySQL це має бути якось схоже.
На сервері SQL ви можете мати кілька індексів, і кожен з них може мати різний рівень фрагментації. Тоді ви можете забрати один і виконати операцію «REORGANIZE» або «REBUILD» у цьому конкретному індексі, не впливаючи на решту.
Наскільки мені відомо, немає "фрагментації таблиці" як такої, і SQL Server не надає жодного інструменту для виправлення "фрагментації таблиці". Він надає інструменти для перевірки фрагментації індексу (розуміється як співвідношення між кількістю сторінок, використовуваних індексом VS, повнотою цієї сторінки та суміжністю), а також внутрішньою та зовнішньою фрагментацією.
Все це досить просто зрозуміти, принаймні для мене.
Тепер, коли настає черга підтримувати індекси в MySQL, існує лише концепція фрагментації таблиці, як згадувалося вище.
Таблиця в MySQL може мати декілька індексів, але коли я перевіряю 'коефіцієнт фрагментації' за допомогою цієї відомої формули, я не бачу фрагментації кожного індексу, а таблиці в цілому.
Коли я хочу оптимізувати індекси в MySQL, я не вибираю конкретний індекс для роботи (як у SQL Server). Натомість я роблю операцію 'OPTIMIZE' у всій таблиці, яка, імовірно, впливає на всі індекси.
Коли таблиця оптимізована в MySQL, відношення між простором, використовуваним даними + індексами VS, загальним простором зменшується, що говорить про певну фізичну переорганізацію на жорсткому диску, що перетворюється на зменшення фізичного простору. Однак фрагментація індексу стосується не лише фізичного простору, але і структури дерева, яка з часом змінювалася завдяки вставленням та оновленням.
Нарешті, я отримав таблицю в InnoDB / MySQL. Ця таблиця містить 3 мільйони записів, 105 стовпців і 55 індексів. Це 1,5 ГБ без урахування індексів, що становить 2,1 ГБ.
Ця таблиця потрапляє тисячі разів за день для оновлення, вставки (ми фактично не видаляємо записи).
Ця таблиця створена роками, і я точно знаю, що ніхто не підтримує індекси.
Я очікував, що там знайдуться величезна фрагментація, але коли я виконую обчислення фрагментації, як було призначено
free_space / (data_length + index_length)
виявляється, у мене лише 0,2% фрагментація. ІМХО - це зовсім нереально.
Отже, великі питання:
- Як перевірити фрагментацію певного індексу в MySQL, а не таблиці в цілому
- Чи дійсно OPTIMIZE TABLE фіксує внутрішню / зовнішню фрагментацію індексу, як у SQL Server?
- Коли я оптимізую таблицю в MySQL, чи реально вона відновлює всі індекси в таблиці?
- Чи реально думати, що зменшення фізичного простору індексу (без перебудови самого дерева) насправді призводить до кращої продуктивності?