Индексирование логических полей
Это, вероятно, действительно глупый вопрос, но будет ли много пользы в индексации логического поля в таблице базы данных?
учитывая распространенную ситуацию, например, записи "мягкого удаления", которые помечены как неактивные, и поэтому большинство запросов включают WHERE deleted = 0, будет ли полезно индексировать это поле самостоятельно или его следует объединить с другими обычно ищущими полями в другом индексе?
6 ответов:
нет.
вы индексируете поля, которые ищут и имеют высокую селективность / мощность. Мощность логического поля уничтожается почти в любой таблице. Во всяком случае, это сделает ваши записи медленнее (на такую крошечную сумму).
может быть, вы бы сделали его первым полем в кластеризованном индексе, если бы каждый запрос учитывал мягкие удаления?
что такое столбец deleted_at DATETIME? Есть два преимущества.
- Если вам нужен уникальный столбец, например name, вы можете создать и мягко удалить запись с тем же именем несколько раз (если вы используете уникальный индекс для столбцов deleted_at и name)
- вы можете искать Недавно удаленные записи.
запрос может выглядеть так:
SELECT * FROM xyz WHERE deleted_at IS NULL
Я думаю, что это поможет, особенно в освещении показателей.
сколько/мало, конечно, зависит от ваших данных и запросов.
вы можете иметь теории всех видов об индексах, но окончательные ответы даются ядром базы данных в базе данных с реальными данными. И часто вы удивляетесь ответу (или, может быть, мои теории слишком плохи;)
изучите план запросов ваших запросов и определите, могут ли запросы быть улучшены, или если индексы могут улучшаться. Это довольно просто изменить индексы и посмотреть, какая разница это делает
Я думаю, что если ваше логическое поле таково, что вы будете ссылаться на них во многих случаях, имело бы смысл иметь отдельную таблицу, например 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, чтобы индексировать работу в этом поле, но, пожалуйста, подтвердите это.
Я думаю, что это помогло бы, если бы вы использовали представление (где deleted = 0), и вы регулярно запрашиваете из этого представления.
Если вы используете базу данных, которая поддерживает растровые индексы (например, Oracle), то такой индекс в логическом столбце будет намного полезнее, чем без него.
Comments