насчет индекса mysql, нескольких столбцов или одного? - PullRequest
0 голосов
/ 26 ноября 2009

У меня есть sql, как это:

SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth

Итак, как мне создать индекс для него?

  • Один индекс для двух столбцов
  • Два индекса для каждого столбца

что лучше?

Ответы [ 4 ]

3 голосов
/ 26 ноября 2009

Если вы оптимизируете именно этот запрос, то a будет лучшей оптимизацией. Ваше предложение WHERE сначала проверит column_a, а затем перейдет к следующей строке, если это не соответствует. Он только продолжит проверку column_b, если соответствует , соответствует column_a. Поэтому вам нужен индекс, который сначала сортируется по column_a, а затем по column_b, а не по двум отдельным индексам.

Считайте, что это в отличие от предложения OR, где вы обычно хотели бы два отдельных индекса, потому что OR говорит: «сначала выберите все совпадения для column_a и , затем выберите все совпадения для column_b, независимо, и, наконец, объединение наборов результатов вместе ". Поскольку этот запрос не использует обратную связь от column_a, когда он проверяет column_b, вы хотите использовать различные индексы там.

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

1 голос
/ 26 ноября 2009

Следует помнить, что индекс MySql для 2 или более столбцов в одном и том же индексе работает для того, чтобы вы создали свой индекс.

Таким образом, чтобы быть оптимизированным, вы должны поместить ваш column_a сначала в индекс, а затем в colun_b. Это нужно для того, чтобы избежать сканирования таблицы.

0 голосов
/ 26 ноября 2009

Вы хотите индекс, который можно ДИАПАЗОН СКАНИРОВАНИЯ. Используйте EXPLAIN (см. Документ), это ваш друг.

Индекс для column_a, column_b должен иметь возможность сканирования диапазона в этом случае, но всегда проверяйте EXPLAIN. Используйте EXPLAIN для непроизводственной базы данных с той же схемой и объемом / распределением данных, что и в вашей производственной системе (будет)

0 голосов
/ 26 ноября 2009

Для лучшего чтения у вас должен быть один индекс на два столбца, если ваш запрос включает оба сравнения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...