Індексація булевих полів


76

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

Враховуючи загальну ситуацію, наприклад записи "м'якого видалення", які позначені як неактивні, а отже, включають більшість запитів WHERE deleted = 0, чи допомогло б індексація цього поля самостійно, чи його слід поєднувати з іншими часто шуканими полями в інший індекс?



18
@AmirAliAkbari: О! Ні! Циркулярне посилання! Сподіваємось, ТАК не вибухне!
Павло

Відповіді:


59

Ні.

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

Можливо, ви зробили б це першим полем в кластерному індексі, якби кожен запит враховував м'які видалення?


5
уявіть собі велику книгу з тисячами сторінок. Сторінки містять одну букву "A" або "B" та випадкове число. Чи могли б Ви отримати користь від пошуку певного випадкового числа, для якого Ви знаєте, що він знаходиться на одній із сторінок "А", коли сторінки А та В не змішані, але книга починається лише зі сторінок А, а потім Б? Так ви б .. так що, мабуть, ви помиляєтесь
Тобі

1
Ви впевнені, що це правильно? Я міг легко побачити, що таке поле має значення, якщо, наприклад, 99% випадків значення було "ні", і ви запитували лише значення "так". (EG лише активні записи?)
RonLugge

1
Я думаю, що відповідь надто спрощена, враховуючи багато інших стратегій індексування в сучасних базах даних. Наприклад, частковий індекс WHERE field = falseабо деякі інші індекси, не пов’язані з btree, які, як правило, специфічні для платформи, забезпечують альтернативи btree для пошуку логічних типів. Це також залежить від ваших умов пошуку та від того, яка частина таблиці відповідає істині проти хибності.
DB140141

17

Що стосується стовпця delete_at DATETIME? Є дві переваги.

  1. Якщо вам потрібен унікальний стовпець, такий як ім'я, ви можете створювати та м'яко видаляти запис із однаковим іменем кілька разів (якщо ви використовуєте унікальний індекс для стовпців delete_at І ім'я)
  2. Ви можете шукати нещодавно видалені записи.

Ваш запит може виглядати так:

SELECT * FROM xyz WHERE deleted_at IS NULL

6

Думаю, це допомогло б, особливо у висвітленні індексів.

Скільки / мало, звичайно, залежить від ваших даних та запитів.

Ви можете мати різноманітні теорії щодо індексів, але остаточні відповіді дає механізм баз даних у базі даних із реальними даними. І часто ви здивовані відповіддю (а може, мої теорії занадто погані;)

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


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

2

Думаю, це допомогло б, якщо б ви використовували представлення даних (де видалено = 0), і ви регулярно здійснювали запити з цього подання.


2

я думаю , що якщо ваше логічне поле таке , що ви б посилань на них у багатьох випадках було б доцільно мати окрему таблицю, приклад DeletedPages або SpecialPages, який буде мати багато логічних полів типу, як is_deleted, is_hidden, is_really_deleted, і requires_higher_userт.д., і тоді ви взяли б об'єднання, щоб отримати їх.

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

select all pages where is_deleted = 1

Швидше було б реалізувати його так:

select all pages where pages 
inner join DeletedPages on page.id=deleted_pages.page_id 

Думаю, я десь читав про бази даних mysql, що вам потрібно поле, щоб принаймні мати значення 3, щоб індексація працювала в цьому полі, але, будь ласка, підтвердьте це.


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

0

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

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