MySQL Edit
Похоже, что некоторые СУБД имеют определенные возможности в этом отношении.
Mysql имеет некоторые индексные "объединения" в соответствии с документацией .
[До MySQL5] MySQL мог использовать не более одного индекса для каждой ссылочной таблицы
Но в 5 он поддерживает ограниченное слияние индексов.
Вам действительно нужно понять, как работают индексы и когда они полезны. При каком проценте строк полное сканирование таблицы имеет больше смысла, чем индекс? Вы поверите, что в некоторых случаях FTS дешевле, чем сканирование индекса, которое возвращает 2% строк? Если гистограмма вашей спальни выглядит следующим образом: 1 = 25%, 2 = 50%, 3 = 20%,> 3 = 5% ... единственный раз, когда индекс в этом столбце полезен, это найти более 3 спален, и он выиграл ' тогда его нельзя использовать из-за переменных связывания и факторов кластеризации.
думай об этом так. Предположим, мой процент спален правильный. Допустим, у вас есть 8 тыс. Страниц (не знаю, что использует Mysql), и каждая строка имеет длину 80 байт. Игнорируя накладные расходы, у вас есть 100 строк (списков) на страницу диска. Так как дома добавляются в произвольном порядке (случайным образом, поскольку спальни переходят) на каждой странице у вас будет 50 домов с 2 спальнями, 25 домов с 1 спальней, 20 домов с 3 спальнями и, возможно, дом с 4 или 5 или около того на этой странице , У КАЖДОЙ страницы будет хотя бы один дом с 1 спальней, поэтому вы будете читать КАЖДУЮ страницу для СПАЛЬНЕЙ = 1, то же самое для 2, то же самое для 3. Это может помочь для 5-комнатных домов ... но если переменная привязки MySQL работает как Oracle, тогда это не будет переключать планы для данного значения Спальни.
Как видите, многое нужно понять ... Гораздо больше, чем указал Джон Скит.
Оригинальный пост
Большинство СУБД не могут объединять индексы в одной таблице. Если у вас есть таблица со столбцами A, B и C, с индексами из одного столбца для A, B и C. и вы ищете, где A = a и B = b и C = c. Он выберет наиболее селективный индекс и будет использовать только этот.
Если вы создадите одиночный многоколонный индекс для A, B, C, тогда этот индекс не будет работать, если вы не включите A = a в WHERE. Если вы где B = b и C = c, то этот индекс игнорируется - в большинстве СУБД.
Вот почему Oracle изобрел индекс Bitmap. Битовый индекс для A, B и C может быть объединен с побитовым И и побитовым ИЛИ операциями. Пока не будет определен окончательный набор Rowids и не будут выбраны выбранные столбцы.
В последних четырех столбцах показан растровый индекс в столбце REGION.
Row Region North East West South
1 North 1 0 0 0
2 East 0 1 0 0
3 West 0 0 1 0
4 West 0 0 1 0
5 South 0 0 0 1
6 North 1 0 0 0
Так что, если вы говорите, что хотите дом, где регион в (север, восток). Вы бы побитовые ИЛИ индекс Севера и Индекс Востока и получили бы строки 1, 2, 6
Если у вас был другой столбец с количеством спален, например
Row Bedrooms 1BR 2BR
1 1 1 0
2 2 0 1
3 1 1 0
4 1 1 0
5 2 0 1
6 2 0 1
если вы AND Спальни = 2, этот индекс вернет 2, 5, 6, а при битовом И в столбце Регион появятся строки 2 и 6.
Но так как вы не упомянули СУРБД, я, возможно, полностью потратил свое время. Ну хорошо.