我正在执行以下查询
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;
运行速度比execute慢很多:
SELECT COUNT(*)
FROM table
WHERE (columnA = value1 AND columnB = value2)
OR (columnA = value1 AND columnC = value3)
拥有两个复合索引:
index1 (columnA,columnB)
index2 (columnA,columnC)
有趣的是,请求Mysql "explain" 查询时,它总是在两种情况下都使用 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工作最快的方法。
field2 >= 1000
和field3 >= 2000
)的元素。 (提示:使用临时表 ;)) - soulmerge