Я выполняю следующий запрос
SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)
Существует один индекс над полем1, а другой - над полем 2 и полем.
Я вижу, что MySQL всегда выбирает индекс field1, а затем делает соединение, используя два других поля, что довольно плохо, потому что ему необходимо объединить 146 000 строк.
Предложения о том, как улучшить это? Благодаря
(ИЗМЕНИТЬ ПОСЛЕ ПОДАЧИ ПРЕДОСТАВЛЯЮЩЕГО РЕШЕНИЯ)
На основе предложенного решения я видел это на Mysql, играя с этим.
SELECT COUNT(*) FROM (SELECT * FROM table WHERE columnA = value1
UNION SELECT * FROM table WHERE columnB = value2) AS unionTable;
намного медленнее, чем выполнить:
SELECT COUNT(*)
FROM table
WHERE (columnA = value1 AND columnB = value2)
OR (columnA = value1 AND columnC = value3)
Имея два составных индекса:
index1 (columnA,columnB)
index2 (columnA,columnC)
Интересно, что Mysql "объясняет" запрос, который всегда занимает index1 в обоих случаях, а index2 не используется.
Если я изменил индексы на:
index1 (columnB,columnA)
index2 (columnC,columnA)
И запрос к:
SELECT COUNT(*)
FROM table
WHERE (columnB = value2 AND columnA = value1)
OR (columnC = value3 AND columnA = value1)
Тогда это самый быстрый способ, которым я нашел Mysql.