MySQL - 索引中的Skip列

时间:2017-09-28 18:27:27

标签: mysql database

我们在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列?或者我们已经找到了最佳解决方案?

1 个答案:

答案 0 :(得分:0)

是的,可能有用!

MySQL index hint

基本上说FROM table USE INDEX (index_name)FROM table FORCE INDEX (index_name)

但这无济于事,因为基本上如果你强制使用INDEX,它就会回来进行全表扫描。

尝试改为

FROM table
WHERE A IN (SELECT DISTINCT A FROM table) 
AND ....

可能更清洁