我们在A,B和C列上有一个带有多列索引的(大)表。
现在我们要使用以下格式进行查询:
SELECT * FROM table WHERE (B=... AND C=...) OR (B=... AND C=...) OR ...
因为表中有很多行,并且没有使用索引,所以查询的性能非常差。
列B,C的索引是理想的,遗憾的是它不可用,我们也不能改变它(其他供应商)。 A列有一个我们不感兴趣的值。
为了让MySQL使用可用的索引,我们在WHERE中添加了一个额外的条件:SELECT * FROM table WHERE (A IN (1, 2, 3, 4, 5, ..., 99, 100)) ((B=... AND C=...) OR (B=... AND C=...))OR ...
。结果是现在正确使用了索引,并且查询性能已经好多了。但是,在查询中提供A的所有可能值看起来有点难看。我的感觉是应该有一种更简单的方法来做同样的事情,或者甚至是更好的表现。
有没有办法强制MySQL使用索引,即使查询中没有使用A列?或者我们已经找到了最佳解决方案?
答案 0 :(得分:0)
是的,可能有用!
基本上说FROM table USE INDEX (index_name)
或FROM table FORCE INDEX (index_name)
但这无济于事,因为基本上如果你强制使用INDEX,它就会回来进行全表扫描。
尝试改为
FROM table
WHERE A IN (SELECT DISTINCT A FROM table)
AND ....
可能更清洁