Скоріше за все, вам зададуть це запитання в контексті розмови про індекси і від вас будуть очікувати розуміння того, що послідовність при створенні і використанні індексу має значення.
Почнемо зі створення:
При створенні композитного індекса, потрібно керуватись селективністю. Спочатку має йти поле з найбільшою селективністю(максимально обрізаємо результати), наприклад customer_id, після чого беремо поле з меньшою селективністю(status) і останнє поле має найменшу селективність(created_at).
Причина такої послідовності - це структура індекса. Якщо спростити, то можна сказати, що вона вкладена і ми можемо доступитись до status, тільки знаючи customer_id.
Давай розберемо на прикладі:
Індекс буде створений коректно, але тобі потрібно буде пояснити правило. При пошуку по цьому індексу, він буде ефективний тільки в випадку передачі значень зліва на право. Отже, якими правилами буде керуватись Query Planner при пошуку:
- Очевидно, якщо ми передамо
customer_id,statusicreated_atіндекс спрацює так як ми очікуємо. - Якщо ми передамо тільки
customer_idіstatus, індекс все ще буде працювати і шукати дані по цим двом полям. - Якщо ми передамо
customer_idicreated_at, індекс буде працювати, але Query Planner не врахуєcreated_at, бо ми пропустили status і таким чином розірвали індекс. Це можна побачити запустившиEXPLAIN. - Якщо ми передамо тільки
created_at, індекс не спрацює і буде виконаний full scan, так як ми не передалиcustomer_id, який стоїть на першому місці(префікс індексу).