2015-12-28 4 views
1

Предположим, у меня есть запрос типа (на MySQL),базы данных для консультаций

select xxx from table x 
where col_a=yyy and col_b=zzz 

И предположим, у меня есть комбинированный индекс col_a и col_b вместе. Мой вопрос в том, как этот индекс комбинации помогает лучше, чем использование одного индекса на col_a или col_b? Будет ли комбинированный индекс повышать эффективность запросов, как я писал? Интересно, почему? Благодарю.

С уважением, Лин

+1

Это ** сильно зависит ** от конкретной, конкретной системы баз данных, которую вы используете. Добавьте тег, чтобы указать, используете ли вы 'mysql',' postgresql', 'sql-server',' oracle' или 'db2' - или что-то еще. –

+0

@marc_s, спасибо, я говорю о MySQL. Обновит мой оригинальный вопрос. :) –

ответ

3

Да составной индекс поможет (за исключением того, что один из предикатов всегда чрезвычайно избирателен сам по себе).

Рассмотрите телефонный справочник.

Если это было заказано только одним ключом LastName без заказа в пределах тех, кто разделяет одну и ту же фамилию, а затем ищет «Мартин Смит» (WHERE FirstName='Martin' AND LastName='Smith') из всех остальных Смитов займет гораздо больше времени, чем поиск в каталоге, заказанном по составному ключу LastName,FirstName.

+0

Спасибо Мартин, интересный пример, как база данных, лежащая в основе обработки составного индекса? Индекс Фамилия + имя как одно значение (точно так же, как индексирование одного столбца)? –

+1

@LinMa Строки на страницах индекса будут содержать оба столбца, и их можно будет отличить, а не просто объединить их вместе, но бинарный поиск может работать с двумя столбцами. Например, '(Smith, Martin)' до или после '(Jones, David)'. Верхние уровни дерева B будут содержать сведения о первом (или последнем) суммарном значении ключа для каждой страницы уровня ниже. –

+0

Спасибо Мартину, еще одна путаница, что вы имеете в виду «чрезвычайно избирательный сам по себе»? Я думаю, что это означает меньшее количество повторяющихся значений (например, предположим, что фамилия более избирательна, то же имя может совпадать с одним или несколькими записями, отличными от количества записей), правильно? –

3

Для запроса, который вы предоставляете, любой составной индекс, который начинается с col_a, col_b или col_b, col_a спичками Оговорки where (при условии, что yyy и zzz константа).

Такой составной индекс может использоваться для непосредственного поиска значений с заданными строками. Я думаю, что MySQL documentation делает довольно хорошую работу по объяснению понятий, которые применяются к любой базе данных.

Лучший индекс будет включать столбцы в списке select. Такой индекс «охватывает» запрос, что означает, что индекс может удовлетворить запрос и получить доступ к исходным страницам данных, не является необходимым.

Индекс не всегда полезный. Например, если все строки имели одинаковые значения в двух столбцах, то использование индекса не добавляет каких-либо преимуществ - и может даже замедлить работу с небольшим количеством бит.

+0

Спасибо Гордон. Удивительно, что если составной индекс не существует, как запрос использует один индекс столбца col_a и col_b? Я не уверен, работает ли он таким образом, он использует один столбец index col_a, чтобы найти все записи, значение col_a которых удовлетворено (равно «yyy»), затем среди удовлетворенных записей он будет также находить полные удовлетворенные записи (чей col_b равным 'zzz')? Если это так, моя путаница на втором этапе заключается в том, как механизм SQL может использовать индекс для col_b для нахождения полного удовлетворенного значения - поскольку запрос второй фазы основан на подмножестве записей? –

+0

подмножество записей (средства, записи, чьи col_a удовлетворяются). Указывает ли индекс на col_b на поиск подмножества записей? –

+1

Индекс в любом столбце будет работать, но не так, как индекс в обоих столбцах. –

Смежные вопросы