【问题标题】:What is better for performances: IN or OR什么更适合表演:IN 或 OR
【发布时间】:2011-10-31 22:39:53
【问题描述】:

我需要做一个检查列值是 2117 还是 0 的请求。

目前,我使用 OR 进行此操作

select [...] AND (account_id = 2117 OR account_id = 0) AND [...]

由于我面临性能问题,我一直在徘徊是否会更好

select [...] AND account_id IN (0, 2117) AND [...]

Explain 命令在这两种情况下给出了相似的结果。所以,也许它更多的是关于优化解析阶段而不是其他任何事情。或者也许这两种方式是完全等价的,并且被 mySQL 优化掉了,我不应该在意。

在 mySQL 网站上,他们这样谈论 OR 优化:

使用 x = ANY(包含 (1,2) 的表)而不是 x=1 OR x=2。

但我没有正确理解语法,甚至不明白为什么。

你怎么看?

【问题讨论】:

  • 据我记得,MySQL 中基于规则的查询优化应该将第一个和第二个查询转换为相同的结构,所以我根本不期望这方面有什么大的改进。

标签: mysql performance optimization request


【解决方案1】:

这里没有比赛...IN总是好多了。

原因是数据库不会使用带有OR 的索引,而是使用带有IN 的索引。

OR 更改为IN 通常是我对查询进行的第一个优化。

【讨论】:

  • 您有参考(或测试数据)证明这是真的吗? EXPLAIN 进行了一个非常简单的测试,结果表明这两种情况都没有经过优化并且涉及表扫描。
  • 我正要问同样的问题。我的测试显示没有区别(在少量数据上)。我在 mysql 文档 cmets (dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) 中找到了对此的引用,但对于 mysql 3.x 来说似乎是这样,但对于 4.x 来说却不是。所以,也许,你只是在那个版本中保持了这个习惯。
  • 这是有道理的; IN 将测试限制为(不)完全相等并且只涉及一列,而 OR 可以涉及所有类型的列和条件。有了 IN 的限制,db 引擎肯定可以做一些优化。
  • @halfer 是的,这是有道理的。但我想知道这是否只是解析问题而不是其他任何事情。一旦 mySQL 发现 OR 是在同一列上完成的,它应该能够优化掉,特别是因为 OR 看起来像:[...] AND (a.account_id=0 OR a.account_id=2217) AND [ ...]。 (见括号)
  • 我在一个 200K 行的表上做了一些基准测试,发现没有显着差异,没有什么值得做的改变
【解决方案2】:

为什么不尝试运行一个繁重的基准测试呢?如果存在显着差异,则选择更好的选项,否则只需使用“OR”以提高可读性。也许源代码会产生一些有用的答案,但这可能超出了效率的范围。

【讨论】:

  • 是的,它超出了范围。关于效率,我的生产数据库现在正在爬行。我的请求最多需要 2 分钟。所以,我没有时间正确设置基准。谢谢
【解决方案3】:

它通常更容易被引擎读取和处理......但是,这是基于一些有限的数字。您不想使用 20 多个 ID 的 IN 或 OR(通常)。当您遇到有一堆数字的情况时,创建一个表(甚至是临时表)并插入您想要连接的值,然后将其用作结果的 SQL 连接的基础。在处理大量数据时提供更好的灵活性。

【讨论】:

  • 感谢您的建议。在这里,我只处理两个值:0 或当前登录用户的 account_id
  • @Thomas,在这种情况下,IN 也同样简单。
【解决方案4】:

我想说很多元素可能会有所不同,但不会有两个。我更倾向于调整索引或查看表架构,以找到有价值的性能改进。

【讨论】:

  • 我在一个有适当索引的数十万行表上都试过了,但没有任何显示
猜你喜欢
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多