Я выполняю следующий запрос
SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)
Существует один индекс для field1 и другой, составленный для field2 и field3.
Я вижу, что 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 работает быстрее всего.