У меня есть sql, как это:
SELECT * FROM tableA WHERE column_a = sth AND colun_b > sth
так, как мне создать индекс для него?
что лучше?
Если вы оптимизируете именно этот запрос, то a
будет лучшей оптимизацией. Ваше предложение WHERE
сначала проверит column_a
, и перейдите к следующей строке, если это не соответствует. Он будет проверяться только column_b
, если он совпадает с column_a
. Поэтому вам нужен индекс, который сначала сортируется column_a
, а затем column_b
, а не два отдельных индекса.
Рассмотрим это, а не предложение OR
, где вам обычно нужны два отдельных индекса, потому что OR
говорит: "Сначала выберите все совпадения для column_a
и затем выберите все совпадения для column_b
, независимо, и, наконец, объединить совокупности результатов". Поскольку этот запрос не использует обратную связь от column_a
, когда он проверяет column_b
, вы хотите использовать там отдельные индексы.
Также обратите внимание, что все это написано в очень общих терминах. Эти вещи могут меняться от случая к случаю в зависимости от того, как выглядят ваши данные. Один хороший способ - создать один индекс, посмотреть, как производительность, отбросить его, создать другую и выбрать лучший.
Следует помнить, что индекс MySql для 2 или более столбцов в одном и том же индексе работает, чтобы вы сделали свой индекс.
Итак, чтобы быть оптимизированным, вы должны поместить свой столбец сначала в индекс, а затем в colun_b. Это делается для предотвращения сканирования таблицы.
Вам нужен индекс, который может быть RANGE SCANNED. Используйте EXPLAIN (см. Документ), это ваш друг.
В этом случае индекс столбца_a, column_b должен иметь возможность сканирования в диапазоне, но всегда проверяйте EXPLAIN. Используйте EXPLAIN в непроизводственной базе данных с той же схемой и объемом/распределением данных, что и ваша производственная система (будет)
Чтобы иметь лучшее чтение, вы должны иметь один индекс в двух столбцах, если в ваш запрос включены оба сравнения.
Однако вы можете создать другой индекс во втором столбце, если ваш запрос содержит только второй столбец в разделе where.