Подтвердить что ты не робот

Индекс для нескольких столбцов в ActiveRecord

В ActiveRecord существует два способа объявления индексов для нескольких столбцов:

add_index :classifications, [:species, :family, :trivial_names]
add_index :classifications, :species
add_index :classifications, :family
add_index :classifications, :trivial_names

Есть ли разница между первым и вторым? Если да, то когда я должен использовать первый и второй?

4b9b3361

Ответ 1

Вы сравниваете составной индекс с набором независимых индексов. Они просто разные.

Подумайте об этом так: составной индекс дает быстрый поиск первого поля во вложенном наборе полей, за которым следует быстрый поиск второго поля внутри ТОЛЬКО записей, уже выбранных первым полем, после чего путем быстрого поиска третьего поля - опять же, только в пределах записей, выбранных предыдущими двумя индексами.

Давайте возьмем пример. Ваш механизм базы данных займет не более 20 шагов, чтобы найти уникальное значение в 1000 000 записей (если используется память) , если используется индекс. Это верно, если вы используете составной или независимый индекс, но ТОЛЬКО для первого поля ( "вид" в вашем примере, хотя я бы подумал, что вам нужны Семья, Виды, а затем Общее имя).

Теперь скажем, что для этого первого значения поля имеется 100 000 совпадающих записей. Если у вас есть только отдельные индексы, тогда любой поиск в этих записях займет 100 000 шагов: по одной для каждой записи, полученной первым индексом. Это связано с тем, что второй индекс не будет использоваться (в большинстве баз данных - это немного упрощение), и необходимо использовать соответствие грубой силы.

Если у вас есть составной индекс, ваш поиск выполняется намного быстрее, потому что ваш второй поиск по полю будет иметь индекс в пределах первого набора значений. В этом случае вам понадобится не более 17 шагов, чтобы получить первое совпадающее значение в поле 2 в пределах 100 000 совпадений в поле 1 (база данных 2 из 100 000).

Итак: шаги, необходимые для поиска уникальной записи из базы данных из 1 000 000 записей с использованием составного индекса по 3 вложенным полям, где первый извлекает 100 000, а второй извлекает 10 000 = 20 + 17 + 14 = 51 шаг.

Шаги, необходимые при тех же условиях, что и только независимые индексы = 20 + 100 000 + 10000 = 110 020 шагов.

Большая разница, а??

Теперь не держите орехи, добавляя составные индексы повсюду. Во-первых, они дорого стоят на вставках и обновлениях. Во-вторых, они приводятся только в том случае, если вы действительно выполняете поиск по вложенным данным (для другого примера я использую их, когда вы извлекаете данные для входа для клиента в течение заданного диапазона дат). Кроме того, они не стоят того, если вы работаете с относительно небольшими наборами данных.

Наконец, проверьте документацию по базе данных. Базы данных стали чрезвычайно сложными в способности развертывать индексы в наши дни, и описанный выше сценарий базы данных 101 может не выполняться для некоторых (хотя я всегда развивается так, как будто это происходит именно так, я знаю, что я получаю).

Ответ 2

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

Индексирование трех столбцов [A, B, C] хорошо работает, когда вам нужно получить доступ к значениям A, A + B и A + B + C. Это не будет хорошо, если ваш запрос (или найти условия или что-то еще) не ссылается на A.

Когда индексы A, B и C индексируются отдельно, некоторые оптимизаторы запросов СУБД будут рассматривать объединение двух или более индексов (с учетом оценки эффективности оптимизатора), чтобы дать аналогичный результат одному индексу с несколькими столбцами.

Предположим, что у вас есть система электронной коммерции. Вы хотите запросить заказы по buy_date, customer_id, а иногда и то и другое. Я бы начал с создания двух индексов: по одному для каждого атрибута.

С другой стороны, если вы всегда указываете buy_date и customer_id, то, пожалуй, наиболее эффективным будет один индекс для обоих столбцов. Порядок значителен: если вы также хотели запросить заказы для всех дат для клиента, сделайте customer_id первым столбцом в индексе.

Ответ 3

Из документов:

При создании индекса на нескольких столбцы, первый столбец используется как имя для индекса. Например, когда вы указываете индекс на двух столбцах [: first,: last], СУБД создает индекс для обоих столбцов, а также индекс для первого столбца: первый. Используя только первое имя для этого индекс имеет смысл, потому что вы никогда не создавать уникальный индекс с этим именем.

Использовать первый метод при создании составного индекса, а второй - при создании индексов по отдельным атрибутам.

Есть несколько хороших пунктов здесь, когда использовать составные индексы, но суть в том, что они хороши при использовании места на нескольких атрибутов. Обратите внимание, что они должны использоваться вместе с другими индексами (всегда индексируйте свои ключи foriegn) - не как замена.