Індекси в базах даних. Види індексів.

Бази даних
Oleksandr Vykhor
11-03-2025 14:48:24


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

1. Прискорення пошуку. Індекси дозволяють швидко знаходити рядки, що відповідають певним умовам запиту (наприклад, `WHERE`).

2. Оптимізація сортування та групування. Якщо запит містить операції `ORDER BY` або `GROUP BY`, індекси допомагають прискорити виконання.

3. Прискорення об'єднання (JOIN). При об'єднанні таблиць індекси допомагають швидко знаходити відповідні рядки у зв’язаних таблицях.

4. Забезпечення унікальності. Унікальні індекси гарантують відсутність дубльованих значень у стовпці або групі стовпців.

5. Підвищення продуктивності. Індекси зменшують кількість операцій введення/виведення (I/O), що особливо важливо для великих таблиць.

Однак індекси мають і недоліки:

  • Додаткове використання пам’яті. Індекси займають додатковий дисковий простір.
  • Навантаження на оновлення. Під час вставки, оновлення або видалення даних індекси повинні оновлюватися, що може уповільнювати ці операції.

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

Типи індексів.

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

1. Одностовпцеві індекси

  • Створюються для одного стовпця таблиці.
  • Підходять для прискорення пошуку за одним стовпцем.

Приклад: `CREATE INDEX idx_name ON users (name);`

2. Складені індекси

  • Створюються для кількох стовпців.
  • Корисні для запитів, що фільтрують або сортують дані за кількома стовпцями.
  • Порядок стовпців в індексі має значення: запити повинні використовувати префікс індексу (наприклад, якщо індекс створений на `(col1, col2)`, запити, що фільтрують тільки за `col1`, використовуватимуть індекс, а запити лише за `col2` — ні).

Приклад: `CREATE INDEX idx_name_age ON users (name, age);`

3. Унікальні індекси

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

Приклад: `CREATE UNIQUE INDEX idx_email ON users (email);`

4. Повнотекстові індекси

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

Приклад: `CREATE FULLTEXT INDEX idx_content ON articles (content);`

5. Просторові індекси

  • Використовуються для роботи з геопросторовими даними (наприклад, координатами, геометрією).
  • Оптимізують пошук географічних об'єктів.

Приклад: `CREATE SPATIAL INDEX idx_location ON places (coordinates);`

6. Хеш-індекси

  • Використовують хеш-функції для швидкого пошуку за точними збігами.
  • Ефективні для операцій `=` , але не підходять для діапазонних запитів (наприклад, `BETWEEN`, `>`).

Приклад: `CREATE INDEX idx_hash ON users USING HASH (email);`

7. B-деревоподібні індекси

  • Найпоширеніший тип індексів.
  • Підтримують діапазонні запити (наприклад, `>`, `<`, `BETWEEN`), а також точні збіги.

Приклад: `CREATE INDEX idx_btree ON users (age);`

8. Бітові індекси

  • Використовуються для стовпців із невеликою кількістю унікальних значень (наприклад, стать, статус).
  • Ефективні для операцій `AND`, `OR` та `NOT`.

Приклад: `CREATE BITMAP INDEX idx_status ON orders (status);`

9. Кластеризовані індекси

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

Приклад: У MySQL первинний ключ (`PRIMARY KEY`) автоматично створює кластеризований індекс.

10. Некластеризовані індекси

  • Створюють окрему структуру даних, що посилається на рядки в таблиці.
  • Таблиця може мати кілька некластеризованих індексів.

Приклад:`CREATE INDEX idx_nonclustered ON users (name);`

11. Часткові індекси

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

Приклад: `CREATE INDEX idx_active_users ON users (name) WHERE status = 'active';`

12. Функціональні індекси

  • Індексують результат функції, застосованої до стовпця.
  • Корисні для запитів, які фільтрують або сортують дані на основі результатів функцій.

Приклад: `CREATE INDEX idx_lower_name ON users (LOWER(name));`

13. Покриваючі індекси

  • Містять усі необхідні дані для виконання запиту, що дозволяє уникнути звернення до самої таблиці.

Приклад: `CREATE INDEX idx_covering ON users (id, name, age);`(якщо запит вибирає лише ці стовпці).

14. Індекси на виразах

  • Подібні до функціональних індексів, але можуть містити складніші вирази.

Приклад: `CREATE INDEX idx_expr ON orders (total_price * quantity);`

15. Індекси для масивів (GIN, GiST, BRIN)

  • Використовуються в PostgreSQL для роботи з масивами, JSON, повнотекстовим пошуком та іншими складними типами даних.

Приклад: `CREATE INDEX idx_gin ON documents USING GIN (tags);`

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


Назад