好的,我在这里有一张桌子,并且我已经在自动递增列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
的情况下它不会通过所有记录。
感谢您的关注。
答案 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)
我怀疑当表格更大时索引会非常有用。
我建议添加足够的测试数据,以便整个表格不适合内存然后重新测试。