насчет индекса mysql, нескольких столбцов или одного?

0

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

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

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

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

что лучше?

  • 0
    Я думаю, что для того, чтобы получить полный ответ, вам нужно быть более точным в отношении данных, содержащихся в этих столбцах. У них есть уникальные ценности? Какого они типа?
Теги:
optimization
indexing

4 ответа

3
Лучший ответ

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

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

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

  • 0
    Нет, он не должен «переходить к следующему ряду, если он не совпадает»; Вы хотите индекс, который будет ДИАПАЗОН СКАНИРОВАНИЯ.
  • 0
    На самом деле, «продолжить» подразумевает обход таблицы, что происходит, когда у вас вообще нет индексов.
1

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

Итак, чтобы быть оптимизированным, вы должны поместить свой столбец сначала в индекс, а затем в colun_b. Это делается для предотвращения сканирования таблицы.

0

Вам нужен индекс, который может быть RANGE SCANNED. Используйте EXPLAIN (см. Документ), это ваш друг.

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

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню