MySQL索引和OR运算符

时间:2014-04-18 18:27:17

标签: mysql

好的,我在这里有一张桌子,并且我已经在自动递增列id上设置了一个主索引。但有时我需要搜索另一个名为owner的列,因为多个项目可以拥有相同的所有者,因此我无法添加唯一索引,因此我继续使用index索引。我跑了一个查询

EXPLAIN SELECT * FROM table WHERE owner = 15 OR owner = 16

然后,对于可能的键,我按预期获得owner,对于使用过的键,我得到NULL。我想这是因为我的行数太少,但如果我运行

EXPLAIN SELECT * FROM table WHERE owner = 15

对于可能的密钥,我得到owner,对于使用过的密钥,我也得到owner,行数相同。

所以这让我不确定这个索引是否会在更大的范围内有用,如果这个索引在OR条件下没用,你们可以告诉我如何索引该表使得在OR的情况下它不会通过所有记录。

感谢您的关注。

2 个答案:

答案 0 :(得分:2)

如果您搜索的值出现在表的很大一部分中,则MySQL优化器不使用索引。根据我的经验,“非常大”意味着约占表格的20%。

所以可能是所有者15有点罕见,但是所有者15和16一起超过了阈值,因此它们代表了表的很大一部分,并且优化器决定执行表扫描或索引扫描

例如,查看EXPLAIN的rows字段中报告的内容。如果优化器认为检查的行数超过表的大小的20%,那就是正在发生的事情。请注意,此处和rows中报告的SHOW TABLE STATUS只是粗略估计。

我已经看到优化器的这种行为不是正确选择的情况,并且使用索引会更好。在这种情况下,您可以使优化器认为表扫描成本过高:

SELECT * FROM table FORCE INDEX(owner) WHERE owner = 15 OR owner = 16

答案 1 :(得分:1)

我怀疑当表格更大时索引会非常有用。

我建议添加足够的测试数据,以便整个表格不适合内存然后重新测试。