【问题标题】:MySQL index optimisation in select using " or " and without选择使用“或”和不使用的 MySQL 索引优化
【发布时间】:2012-08-13 04:56:06
【问题描述】:

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

我使用 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.024ms

第三

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

时间:0.007ms

我的问题是:wtf ?还有怎么解决的?

提前致谢!

编辑:好的,这似乎是 mysql 的限制,不能是真的 已修复,所以我决定只运行两个查询而不是一个,我得到了 0.031ms,这比 0.270ms 要好。

【问题讨论】:

  • @Ariel 给出了一个很好的答案,但我不接受它。

标签: mysql optimization indexing


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

【讨论】:

  • 这就解释了,我仍然对使用 UNION 有点担心,它确实会弄乱我的列,但这将是另一个问题。
  • 我也选择了 MySQL 而不是 PostreSQL,因为我认为 MySQL 更快。
  • @RaslyWalker UNION 不会弄乱列 - 但您必须确保所有查询中的所有列都相同。 MySQL 可以比 PostgreSQL 更快,但这取决于你如何使用它以及你使用它的目的,这不是一揽子的事情。
  • 也许你可以帮我解决关于unioncolumnsstackoverflow.com/questions/11714577/…的其他问题
  • @RaslyWalker 好的,我给你写了一个答案。
猜你喜欢
  • 2011-11-09
  • 2016-06-14
  • 2018-12-09
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多