Devs Hive
Повернутися до всіх запитань

Що таке композитні індекси?

SeniorDatabasesMiddle
Зустрічали на інтервʼю:0 користувачів

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

Почнемо зі створення:

При створенні композитного індекса, потрібно керуватись селективністю. Спочатку має йти поле з найбільшою селективністю(максимально обрізаємо результати), наприклад customer_id, після чого беремо поле з меньшою селективністю(status) і останнє поле має найменшу селективність(created_at).

Причина такої послідовності - це структура індекса. Якщо спростити, то можна сказати, що вона вкладена і ми можемо доступитись до status, тільки знаючи customer_id.

Давай розберемо на прикладі:

-- Уявимо, що в нас є таблиця замовлень
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
status TEXT NOT NULL,
created_at TIMESTAMP NOT NULL
);

-- Ми створюємо композитний індекс на декілька колонок
CREATE INDEX idx_orders_customer_status_created
ON orders (customer_id, status, created_at);

Індекс буде створений коректно, але тобі потрібно буде пояснити правило. При пошуку по цьому індексу, він буде ефективний тільки в випадку передачі значень зліва на право. Отже, якими правилами буде керуватись Query Planner при пошуку:

  1. Очевидно, якщо ми передамо customer_id, status i created_at індекс спрацює так як ми очікуємо.
  2. Якщо ми передамо тільки customer_id і status, індекс все ще буде працювати і шукати дані по цим двом полям.
  3. Якщо ми передамо customer_id i created_at, індекс буде працювати, але Query Planner не врахує created_at, бо ми пропустили status і таким чином розірвали індекс. Це можна побачити запустивши EXPLAIN.
  4. Якщо ми передамо тільки created_at, індекс не спрацює і буде виконаний full scan, так як ми не передали customer_id, який стоїть на першому місці(префікс індексу).

Зустрічав на інтервʼю?

Коментарі (0)

Увійдіть, щоб залишити коментар

Поки що немає коментарів. Будьте першим!