Індексація бази даних


12

Я не так знайомий з базами даних, і зараз я намагаюся зрозуміти механізм індексації.

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

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

Чому я не повинен додати всі можливі індекси до потрійного магазину та розширення до RDBMS, чому б не зробити індекси на кожному стовпчику (якщо припустити, що я не лінивий)?

Відповіді:


25

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

Це особливо помітно на вставках. Уявіть, якби кожну вставку, яку ви зробили в таблицю, потрібно було повторити на 20 інших таблицях. Це буде болісно повільно.

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


2

Індекси - це в основному додаткові структури даних, які потрібно будувати та зберігати. Побудова індексів енергії процесора (під час операцій із записом) та збереження його відходів ємності диска.

Чому ви хочете створювати та зберігати індекси, якими ви ніколи не користуєтесь?


Це суто теоретичне запитання ("що робити, якщо ні чому").
Драгос

@Dragos Я думаю, що відповідь на це питання очевидна з мого поста: Якщо ви зробили це, кожна операція з написання тексту буде набагато повільніше, і кожен запис витрачав би велику кількість дискового простору. Чому ні? Тому що живлення процесора та дискове зберігання дорого.
Matěj Zábský

2

Розміщуйте індекси лише за потреби. Як правило, коли я розробляю схему бази даних, кожна таблиця отримує індекс кластеризованого первинного ключа PK для початку. Це буде унікальний ідентифікатор даних у цій таблиці. У може бути на 1 стовпчик або багато.

Після цього я зазвичай просто додаю некластеризовані унікальні індекси у стовпці (ях), на яких я хочу надати унікальність.

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

Кожен доданий індекс збільшує використаний проміжок, а також додає додаткове обслуговування. Тому вибирайте свої індекси розумно.


Під час читання вашої відповіді в голову вискакує ще одне запитання: чи зазвичай Первинні ключі автоматично індексуються, чи я повинен сам вказати, що вони будуть індексуватися? Скажіть, наприклад, у базі даних MySQL?
Драгос

Так, первинний ключ повинен автоматично створити кластерний індекс для вашого (SQL Server). Лише один первинний ключ, таким чином, лише один кластерний індекс на таблицю. MySQL має бути подібним, але, можливо, експерт MySQL може перевірити.
Джон Рейнор

2

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

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

Крім того, індекси в одному стовпчику навіть не найкраще, що можна зробити. Більшість баз даних відношень фактично дозволяють індексувати на декількох стовпцях, і порядок цих стовпців має значення. Наприклад, якщо я хочу шукати в базі даних для всіх людей, які ходили до герцога з класів між 1980 і 1984 роками, то те, що я хочу, - це індекс (School, ClassYear). Запит не зможе використати індекс із тими ж стовпцями, але буде перевернуто.

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

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


Але чи могли б у вашому прикладі два індекси: один про школу та інший на ClassYear корисний у будь-якому із випадків?
Драгос

@Dragos Звичайно, вони можуть бути. Якби у мене був ще один запит, який був лише за рік класу (всі учні, які відвідували школу в класі 2004 року), то індекс класу рік може бути корисним. На жаль, існує низка факторів, які використовує система запитів, коли визначає, який індекс використовувати, коли. Якщо з'ясується , що половина людей в базі даних були йти в школу в 2004 році, то база даних може просто ігнорувати індекс і сканування по всій таблиці в будь-якому випадку. Якщо ви хочете поправитись у цьому, починайте використовувати та читати плани виконання
Кріс Пітман

Що я мав на увазі: Якщо у мене є окремі індекси щодо школи та ClssYear, чи вони будуть корисні при пошуку всіх людей, які ходили до герцога з класів між 1980 та 1984 роками?
Драгос

@Dragos Це залежить від конкретного двигуна db. Наприклад, Postgres буде використовувати щось, що називається Bitmap Index Scan , щоб перетинати результати декількох індексів. Вибирати, який індекс використовувати, буде вирішувати механізм запитів, і це завжди буде конкретним db.
Кріс Пітман

2

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

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

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