MySQL - чому б не індексувати кожне поле?


107

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

Індекси чудові, але чому хтось не міг просто проіндексувати всі поля, щоб зробити таблицю неймовірно швидкою? Я впевнений, що є вагомі причини цього не робити, але як щодо трьох полів у таблиці з тридцятьма полями? 10 у полі 30? Де слід проводити лінію і чому?


7
спробуйте вставити значення в таблицю з індексом понад 10 К записів, всі записи повинні оновлюватися через вставлення / видалення, і це величезний накладний час і дещо накладні витрати, якщо кожне значення має індекс
Ісус Рамос

5
Окрім простору та продуктивності запису, є ще одна причина: використання декількох індексів для однієї таблиці дуже неефективно . Це означає, що навіть якщо у вас є один індекс у кожному стовпчику, вибір продуктивності не дуже хороший, якщо в пункті WHERE доступ до кількох стовпців. У такому випадку найкращим є індекс з декількома стовпцями.
Маркус Вінанд

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

Відповіді:


122

Індекси займають місце в пам'яті (ОЗП); Занадто багато або занадто великих індексів, і БД доведеться міняти їх на диск і з нього. Вони також збільшують час вставки та видалення (кожен індекс повинен бути оновлений для кожного фрагмента даних, вставлених / видалених / оновлених).

У вас немає нескінченної пам’яті. Зробити це так, щоб усі індекси вмістилися в ОЗУ = добре.

У вас немає нескінченного часу. Індексація лише потрібних вам індексованих стовпців мінімізує звернення ефективності вставки / видалення / оновлення.


11
Приємна випадкова відповідь, яка дає загальне розуміння, але не дуже допомагає фактично визначити, де провести лінію на індексах. Звідки ти можеш знати? Просто додайте їх у звичайні поля WHERED та сподіваєтесь на краще?
Андрій

@Andrew через півтора року, ти знайшов відповідь на своє запитання?
Сінджай

1
@Sinjai Мабуть, додавання їх до часто куди стовпців - це хороше правило. Але в іншому випадку ви можете багато читати, виявляється, якщо хочете стати експертом з індексів. напр. stackoverflow.com/questions/3049283/…
Андрій

Не забувайте місця на диску.
jpmc26

27

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

Крім того, кожен індекс займає додатковий простір на диску та простір пам’яті (коли він викликається), тому він може потенційно уповільнити операції з читання (також для великих таблиць). Заціни


6
Посилання призначене для MS SQL Server ; це питання для MySQL
OMG Ponies

5
@OMG більшість пунктів посилання стосується всіх основних RDBMS
RichardTheKiwi

5
@Richard aka cyberkiwi: ANSI не охоплюється ANSI - це диво, кожен постачальник використовував подібну термінологію. Але навіть тоді тільки SQL Server та MySQL використовують термінологічний індекс "кластерний" та "некластеризований" - це означає більше для SQL Server, ніж MySQL. Нічого не гарантує, що рекомендації одного постачальника повинні застосовуватися до іншого.
OMG Ponies

3
@omg перші 6 пунктів застосовуються до будь-яких dbms. пропустіть некластеризовані, нижче внизу є більше балів щодо загальної індексації, також по точці. Якщо у вас є конкретні речі, які ви хочете вказати, зателефонуйте їм. Інакше виглядає так, що ви заперечуєте всі відповіді, які з коментарів (включаючи вашу видалену відповідь), що ніхто не погоджується з вашою оцінкою.
RichardTheKiwi

10

Ви повинні збалансувати потреби CRUD. Запис у таблиці стає повільним. Що стосується того, де провести лінію, це залежить від того, як здійснюється доступ до даних (сортування фільтрації тощо).


а також кожен індекс займає деякий простір бази даних
Акантус

@Acanthus: Найменші наявні жорсткі диски вимірюються в гігабайтах .
OMG Ponies

4
@OMG, але не ОЗУ, як вказує Брайан. це не ніколи гарна ідея , щоб зберігати більше , ніж потрібно. кешування даних / індексів в оперативній пам’яті, носії резервного копіювання (версії, які підходять на стрічку і т. д.) усі
впливають

9
Велика кількість ресурсу не є причиною марнотратства та неефективності.
Смандолі

6
Щоправда, але обмеження не такі, які були 10+ років тому.
OMG Ponies

2

Індексація займе більше виділеного простору як від накопичувача, так і від оперативної пам'яті, але також значно покращить продуктивність. На жаль, коли вона досягне межі пам’яті, система здасть провідний простір і ризикує продуктивністю. Практично ви не повинні індексувати жодне поле, яке, на вашу думку, не передбачає жодного алгоритму переходу даних, ані вставки, ані пошуку (пункт WHERE). Але вам слід, якщо інше. За замовчуванням потрібно проіндексувати всі поля. Поля, які слід розглянути як нерозбірник, - це якщо запити використовує лише модератор, за винятком випадків, якщо вони також потрібні для швидкості


2

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

друге питання стосувалося межі, де зупинитися. Спочатку давайте зробимо математичний розрахунок, припустимо, у нас N рядків з L полями, якщо індексувати всі поля, ми отримаємо L нових таблиць індексів, де кожна таблиця буде сортована у значущим чином дані поля індексу, на перший погляд, якщо ваша таблиця має вагу W, вона стане W * 2 (1 тера стане 2 тера), якщо у вас є 100 великих таблиць (я вже працював у проекті, де номер таблиці був близько 1800 таблиці) Ви витратите 100 разів більше місця (100 тера), це далеко не розумно.

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

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

що індексувати?

іноземні ключі: базується на

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

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

З цього 3 пункту я можу зробити висновок, що якщо у нас є поля L, що складаються з клавіш K, то межа має бути дещо ближчим ((L-K)/2)+Kдо L / 10

ця відповідь ґрунтується на моїй логіці та особистих підказках


1

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


Я не впевнений, чи зробить це читання таблиці блискавично, особливо якщо таблиця даних становить лише 100 Мб, але індекс.таблиця 300 Мб або більше.
Девід

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