-2

我有一个要快速查询的查询,但有些东西我还不明白。

我使用 3 个查询进行了简单的测试。

在我的表中有列 1,并且3是带有普通键的 int(每个都有自己的索引) 15,35 是带有全文键的字符串(每个都有自己的索引)

第一的

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

时间:250ms

第二

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

时间:0.024ms

第三

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

时间:0.007ms

我的问题是:wtf?还有如何解决它?

提前致谢!

编辑:好的,这似乎是 mysql 的限制,无法真正修复,所以我决定只运行两个查询而不是一个,我得到 0.031 毫秒,这比 0.270 毫秒好得多。

4

1 回答 1

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 - 我不确定,但我认为它可以处理这种类型的查询。

于 2012-08-13T05:03:54.750 回答