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

if(!--pending)

означает

if(0 == --pending)

означает

pending = pending - 1;
if(0 == pending)
45
задан Ian Elliott 14 July 2009 в 02:02
поделиться

3 ответа

You are comparing a composite index with a set of independent indices. They are just different.

Think of it this way: a compound index gives you rapid look-up of the first field in a nested set of fields followed by rapid look-up of the second field within ONLY the records already selected by the first field, followed by rapid look-up of the third field - again, only within the records selected by the previous two indices.

Lets take an example. Your database engine will take no more than 20 steps to locate a unique value within 1,000,000 records (if memory serves) if you are using an index. This is true whether you are using a composite or and independent index - but ONLY for the first field ("species" in your example although I'd think you'd want Family, Species, and then Common Name).

Now, let's say that there are 100,000 matching records for this first field value. If you have only single indices, then any lookup within these records will take 100,000 steps: one for each record retrieved by the first index. This is because the second index will not be used (in most databases - this is a bit of a simplification) and a brute force match must be used.

If you have a composite index then your search is much faster because your second field search will have an index within the first set of values. In this case you'll need no more than 17 steps to get to your first matching value on field 2 within the 100,000 matches on field 1 (log base 2 of 100,000).

So: steps needed to find a unique record out of a database of 1,000,000 records using a composite index on 3 nested fields where the first retrieves 100,000 and the second retrieves 10,000 = 20 + 17 + 14 = 51 steps.

Steps needed under the same conditions with just independent indices = 20 + 100,000 + 10,000 = 110,020 steps.

Big difference, eh?

Now, don't go nuts putting composite indices everywhere. First, they are expensive on inserts and updates. Second, they are only brought to bear if you are truly searching across nested data (for another example, I use them when pulling data for logins for a client over a given date range). Also, they are not worth it if you are working with relatively small data sets.

Finally, check your database documentation. Databases have grown extremely sophisticated in the ability to deploy indices these days and the Database 101 scenario I described above may not hold for some (although I always develop as if it does just so I know what I am getting).

89
ответ дан 26 November 2019 в 21:07
поделиться

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

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

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

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

1
ответ дан 26 November 2019 в 21:07
поделиться

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

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

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

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

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

t ссылка A.

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

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

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

t ссылка A.

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

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

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

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

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

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

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

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

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

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

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

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

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

10
ответ дан 26 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: