选择使用“或”而不使用的MySQL索引优化

时间:2012-08-13 04:56:06

标签: mysql optimization indexing

我有一个问题,我想要快速,但有一些我还不明白。

我只使用3个查询进行测试。

在我的表中有列 13是普通密钥的int(每个都有自己的索引) 15和35是带有全文密钥的字符串(每个都有自己的索引)

第一

select `1` from el where ( `15`='Bump' or `35`='Bump' and `3`='1' ) limit 1;

时间:250毫秒

第二

select `1` from el where ( `35`='Bump' and `3`='1' ) limit 1;

时间:0.024毫秒

第三

select `1` from el where ( `15`='Bump' and `3`='1' ) limit 1;

时间:0.007毫秒

我的问题是:wtf?还有如何修复它?

提前致谢!

  

编辑:好吧,好像这是一个mysql限制,不能真的   固定,所以我决定只运行两个查询而不是一个,我得到   0.031ms,这比0.270ms更好。

1 个答案:

答案 0 :(得分:1)

你不能直接修复它,它是MySQL的一个限制,它只能从一个索引读取来进行查询,但没有一个索引可以处理它们为OR时的所有三个条件。

即。它必须单独检查每一个以查找匹配的任何行,但没有单个索引可以确定排除行,因此根本不能使用任何索引。

使用AND,它可以选择一个,查找匹配的行,然后进一步过滤它们(不使用索引),以确保它们与其余条件匹配。

那么如何解决?使用UNION

SELECT `1` FROM el WHERE `15`='Bump'
UNION
SELECT `1` FROM el WHERE `35`='Bump'
UNION
SELECT `1` FROM el WHERE `3`='1'

这会单独运行检查,然后将它们组合起来。

PS。是的,MySQL应该自动执行此操作,但事实并非如此。您可能希望研究PostreSQL - 我不确定它,但我认为它可以处理这种类型的查询。