我有一个问题,我想要快速,但有一些我还不明白。
我只使用3个查询进行测试。
在我的表中有列
1
和3
是普通密钥的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更好。
答案 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 - 我不确定它,但我认为它可以处理这种类型的查询。