mysql забагато індексів?


83

Я витрачаю деякий час на оптимізацію нашої поточної бази даних.

Я розглядаю індекси конкретно.

Є кілька питань:

  • Чи існує таке поняття, як забагато індексів?
  • Що індекси прискорять?
  • Що індекси сповільняться?
  • Коли добре додати індекс?
  • Коли погано додавати індекс?
  • Плюси та мінуси кількох індексів проти індексів із кількома стовпцями?

Відповіді:


150

Що індекси прискорять?

Отримання даних - оператори SELECT.

Що індекси сповільняться?

Маніпулювання даними - оператори INSERT, UPDATE, DELETE.

Коли добре додати індекс?

Якщо ви відчуваєте, що хочете отримати кращі результати пошуку даних.

Коли погано додавати індекс?

На таблицях, де спостерігатимуться важкі маніпуляції з даними - вставка, оновлення ...

Плюси та мінуси кількох індексів проти індексів із кількома стовпцями?

Запити повинні враховувати порядок стовпців, коли йдеться про індекс покриття (індекс для більш ніж одного стовпця), зліва направо у визначенні стовпця індексу. Порядок стовпців у виписці не має значення, лише порядок у стовпцях 1, 2 та 3 - для виразу потрібно мати посилання на стовпець 1 перед тим, як використовувати індекс. Якщо є лише посилання на стовпці 2 або 3, індекс покриття для 1/2/3 не може бути використаний.

У MySQL для запиту SELECT / оператора в запиті можна використовувати лише один індекс (підзапити / тощо розглядаються як окремий оператор). І існує обмеження кількості місця в таблиці, яке дозволяє MySQL. Крім того, запуск функції в індексованому стовпці робить індекс марним - IE:

WHERE DATE(datetime_column) = ...

11
вау, ця інформація дійсно дивно добре структурована і дуже корисна! І найбільш корисним для мене було те, що індекс, до якого застосовується функція, марний ... дякую за цю відповідь!
Кріс,

2
@OMG, Що стосується вашого останнього абзацу, то selectчерез злиття індексу можна використовувати більше одного індексу. percona.com/blog/2012/12/14/…
Пейсерер

1
-1 за вимову (1) це лише прискорює "ВИБОР", це прискорює запити ВИБОР, ОНОВЛЕННЯ та ВИДАЛЕННЯ, за умови, що індекси правильно створені відповідно до умов "ДЕ", але вимагає оновлення індексів при маніпулюванні даними, що означає що лише запити INSERT будуть повільнішими (у всіх випадках), ніж без індексів, і (2) за те, що MySQL може використовувати лише один індекс одночасно.
Патрік Аллаерт,

Те саме, що і @PatrickAllaert -1 за оманливу інформацію про оновлення, видалення
Eimsas

64

Я не згоден з деякими відповідями на це питання.

Чи існує таке поняття, як забагато індексів?

Звичайно. Не створюйте індекси, які не використовуються жодним із ваших запитів. Не створюйте зайві індекси. Використовуйте такі інструменти, як pt-duplicate-key-checker та pt-index-usage, щоб допомогти вам виявити непотрібні вам індекси.

Що індекси прискорять?

  • Умови пошуку в пункті WHERE.
  • Умови приєднання.
  • Деякі випадки ЗАМОВЛЕННЯ.
  • Деякі випадки GROUP BY.
  • УНІКАЛЬНІ обмеження.
  • ОБМЕЖЕННЯ ІНОЗЕМНИХ КЛЮЧІВ.
  • ПОЛНОТЕКСТНИЙ пошук.

Інші відповіді свідчать, що INSERT / UPDATE / DELETE повільніші, чим більше у вас індексів. Це правда, але враховуйте, що багато застосувань UPDATE та DELETE також мають речення WHERE, а в MySQL UPDATE та DELETE також підтримують JOINs. Індекси можуть отримати користь від цих запитів більше, ніж компенсувати накладні витрати на оновлення індексів.

Крім того, InnoDB блокує рядки, на які впливає ОНОВЛЕННЯ або ВИДАЛЕННЯ. Вони називають це блокуванням на рівні рядка, але це насправді блокування на рівні індексу. Якщо немає індексу для звуження пошуку, InnoDB повинен заблокувати набагато більше рядків, ніж конкретний рядок, який ви змінюєте. Він навіть може зафіксувати всі рядки таблиці. Ці блокування блокують зміни, внесені іншими клієнтами, навіть якщо вони логічно не суперечать.

Коли добре додати індекс?

Якщо ви знаєте, вам потрібно виконати запит, який би скористався індексом в одному з наведених вище випадків.

Коли погано додавати індекс?

Якщо індекс є лівим префіксом іншого існуючого індексу, або індекс не допомагає жодному із запитів, які потрібно виконати.

Плюси та мінуси кількох індексів проти індексів із кількома стовпцями?

У деяких випадках MySQL може виконувати оптимізацію злиття індексів та об'єднувати або перетинати результати незалежних пошукових запитів. Але це дає кращу продуктивність для визначення одного індексу, тому об’єднання індексів не потрібно робити.

Для одного з моїх клієнтів-консультантів я визначив індекс із декількох стовпців у таблиці багато-до-багатьох, де індексу не було, та покращив їх запит на приєднання в 94 мільйони разів!

Створення правильних індексів - складний процес, заснований на запитах, які потрібно оптимізувати . Не слід висувати загальні правила, такі як "індексувати все" або "нічого не індексувати, щоб уникнути уповільнення оновлення".

Дивіться також мою презентацію Як справді розробляти індекси .


10
+1 за "... враховуйте, що багато застосувань UPDATE та DELETE також мають речення WHERE, а в MySQL UPDATE та DELETE також підтримують JOINs. Індекси можуть отримати користь від цих запитів більше, ніж компенсувати накладні витрати на оновлення індексів."
Роб Крейг,

1
Це має бути прийнятою відповіддю для того, щоб взяти до уваги пункти, які розглядаються при оновленні та видаленні.
Леонардо Еміліо Домінгуес

1
Це правильна відповідь, та, яка позначена як правильна, неправильна.
Еймас

7

Чи існує таке поняття, як забагато індексів?

Індекси повинні бути проінформовані про проблему, що виникає: таблиці, запити, які запускатиме ваша програма тощо.

Що індекси прискорять?

ВИБОРИ.

Що індекси сповільняться?

ВСТАВКА буде повільнішою, оскільки вам доведеться оновити індекс.

Коли добре додати індекс?

Коли вашій програмі потрібен інший пункт WHERE.

Коли погано додавати індекс?

Коли вам це не потрібно для запиту чи застосування обмежень унікальності.

Плюси та мінуси кількох індексів проти індексів із кількома стовпцями?

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


4

Чи існує таке поняття, як забагато індексів?

Так. Не виходьте на пошуки створення індексів, створіть їх за необхідності.

Що індекси прискорять?

Будь-які запити до таблиці / подання індексів.

Що індекси сповільняться?

Будь-які оператори INSERT проти індексованої таблиці будуть уповільнені, оскільки кожен новий запис потрібно буде індексувати.

Коли добре додати індекс?

Коли запит не виконується з прийнятною швидкістю. Можливо, ви фільтруєте записи, які не є частиною кластерного ПК, і в цьому випадку вам слід додати індекси на основі фільтрів, які ви шукаєте (якщо продуктивність вважає за потрібне).

Коли погано додавати індекс?

Коли ви робите це заради цього - тобто надмірну оптимізацію.

Плюси та мінуси кількох індексів проти індексів із кількома стовпцями?

Залежить від запитів, які ви намагаєтеся покращити.


3

Чи існує таке поняття, як забагато індексів?

Так, як і всі речі, забагато індексів уповільнить маніпулювання даними.

Коли добре додати індекс?

Хороша ідея додати індекс, коли ваші запити занадто повільні (тобто у вас занадто багато об’єднань у ваших запитах). Вам слід використовувати цю оптимізацію лише після того, як ви створили надійну модель, щоб налаштувати продуктивність.

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