Де можна знайти поради щодо стратегій індексів?


22

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

Як правило, які поля слід індексувати?
Які поля не слід індексувати?
Які правила використання індексів під час досягнення балансу між занадто великою та недостатньою кількістю індексів для досягнення поліпшення продуктивності, а не деградації?


7
Для вказівки щодо індексації використовуйте- the-index-luke.com
Майк

Відповіді:


24

Короткий

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

Довго

Зважаючи на те, що середня база даних становить близько 98% читання (або вище) читання потрібно оптимізувати. INSERT - це зчитування, якщо є, наприклад, унікальний індекс. Або ГУД на оновлення. Я колись читав, що навіть база даних з інтенсивним записом все ще читає 85%.

У вас є неякісна індексація. Приклади:

  • широкі кластерні індекси (особливо SQL Server)
  • немонотонне кластеризоване індексування
  • індекси, що перекриваються (наприклад, cold, coleтаcold, cole, colf)
  • багато індексів одного стовпця (також перекриваючись більш корисними індексами), які марні для ваших запитів
  • не включає ВКЛЮЧЕННЯ, не охоплює (наприклад, всі індекси одного стовпця)
  • ...

Зауважте, цілком характерно, щоб індекси в кілька разів перевищували фактичні дані навіть у OLTP-системах.

Як правило, я б почав з

  • кластерний індекс (зазвичай PK)
  • унікальні індекси (не обмеження, вони не можуть охоплювати)
  • стовпці із зовнішнім ключем

Тоді я подивився б:

  • поширені запити та подивіться, що мені потрібно. Запит, що виконується кожні секунди, потребує налаштування. Звіт у неділю 4 ранку може зачекати.
  • із SQL Server - зважений відсутній показник DMV

Сказавши це, я порушив ці правила для деяких систем, побачивши, як все змінилося (10 мільярдів рядків пізніше) для налаштування системи. Але я б ніколи не думав про індексацію, якщо б не зміг продемонструвати, чому я це роблю.


2
Звідки ти взяв ці цифри? 98% здається жахливо високим, особливо в епоху "великих даних" (він же зберігає все і сподіваюся, що це буде корисно в якийсь день)
rm

7

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


7

Досить просто одна з найкращих серій статей, написаних, які індекси обрати і чому це буде Гейл Шоу. Ви можете знайти статті, натиснувши тут

На запитання, яке ви задаєте, можна відповісти 50 різними способами. Це дійсно все зводиться до ваших даних і до того, як вони будуть запитуватися. Загальне правило полягає в тому, що ви завжди повинні мати кластерний індекс на кожній таблиці, щоб уникнути купи. Кластерні індекси, як правило, мають бути як можна меншими. Якщо в таблиці є кластерний індекс, то всі записи індексу на листкових сторінках некластеризованого індексу зберігатимуть відповідне значення запису кластерного індексу для пошуку закладок. Якщо таблиця - це купа, SQL створить унікальний ідентифікатор для пошуку закладок. Я не можу згадати розмір, який становить 8 або 16 байт. Це може стати набагато більшим типом даних, тоді скажімо, INT. Уявіть, що у купі таблиці є 8 некластеризованих індексів.


Лише зауваження читачам: "Пошук закладок" MS SQL еквівалентний "ОКРАСУВАННЯ РОЗВИТОК" Oracle. Див stackoverflow.com/a/820731/122727
kubanczyk

5

Я хочу додати тут, що різні бази даних вимагають різних стратегій. Порівняємо, наприклад, MySQL w / InnoDB та PostgreSQL.

InnoDB

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

  1. Послідовне сканування в Innodb генерує безліч випадкових вводу / виводу диска та

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

  3. Шукання первинних ключів у цій моделі швидше, ніж у будь-якому іншому підході.

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

PostgreSQL

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

Первинні ключі в PostgreSQL - це, як правило, підмножина унікальних індексів, де жодне значення не може бути NULL. UNIQUE обмеження виконуються за допомогою неявних індексів, а кілька інших типів індексу підтримуються різними операціями, можливими в індексі.

Це означає:

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

  2. Сканування фізичного порядку виконуються набагато краще, зменшуючи випадкові введення / виведення диска, де потрібно обробити значну кількість рядків.

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

У цій моделі індекси часто необхідні, але планувальник має більше свободи, коли використовувати індекс, і наслідки його використання часто є менш серйозними. Таблиці більш оптимізовані (а не спеціалізуються на пошуку файлів pkey), тому потрібно менше індексів.

TL; DR

Знайте свої RDBMS.



2

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

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

Тут є багато інформації, але не варто її засмучувати.

Про сторінку Кімберлі тут


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