次のクエリを実行しています
SELECT COUNT(*)
FROM table
WHERE field1='value' AND (field2 >= 1000 OR field3 >= 2000)
field1 に 1 つのインデックスがあり、field2&field3 に合成された別のインデックスがあります。
MySQL は常に field1 インデックスを選択し、146.000 行を結合する必要があるため、他の 2 つのフィールドを使用して結合を行います。
これを改善する方法についての提案はありますか? ありがとう
(提案された解決策を試した後に編集)
提案されたソリューションに基づいて、これで遊んでいるときに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)
2 つの複合インデックスを持つ:
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 が動作することを発見した最速の方法です。