【问题标题】:MySQL 5.5: is it better to use IN(...) or a series of EQUALS-AND's? [duplicate]MySQL 5.5:使用 IN(...) 还是一系列 EQUALS-AND 更好? [复制]
【发布时间】:2014-01-25 20:28:42
【问题描述】:

我正在清理别人的代码。在通过生成非常复杂的 SQL 查询的非常复杂的系统时,我看到了 IN() WHERE 子句的很多用法:

SELECT * FROM table
 WHERE field1 IN( 1, 2, 3, 4, 5 )
   AND type IN( 1, 2, 3 )

... 等等。像这样组装一系列field = 1 OR field = 2 OR...是不是性能更好:

SELECT * FROM table
 WHERE ( field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = 4 OR field1 = 5 )
   AND ( type = 1 OR type = 2 OR type = 3 )

还是使用 IN() 更好?即使是像type IN(1)这样的单个值?

【问题讨论】:

  • 检查EXPLAIN 两者。 “这会生成非常复杂的 SQL 查询”——您是否有信心实际更改它们?
  • @zerkms:使用 EXPLAIN 没有任何区别。在 phpMyAdmin 中打开分析会产生截然不同的结果。

标签: sql mysql-5.5


【解决方案1】:

答案因 MySQL 的版本而异。开发人员一直致力于在每个主要版本中改进优化器,因此在 MySQL 5.6 或更高版本中 OR 与 IN 的效率可能会大不相同。这也取决于我们在谈论多少个术语,以及索引选择性等等。

最好的建议是使用真实数据在已安装的 MySQL 版本上对真实查询进行基准测试和分析。

【讨论】:

    【解决方案2】:

    最好使用 IN 来提高可读性和维护性。性能将是相同的,如果不是更好的话。事实上,您可能会因为服务器不必解析荒谬的 or..or..or..or 废话列表而获得性能提升。请记住,服务器不只是运行 SQL,它必须解析它并理解它。对我们人类来说更具可读性对服务器来说也更具可读性,因此解析速度更快。

    【讨论】:

    • “对我们人类来说更具可读性,对服务器来说也更具可读性”——事实并非如此。
    • @developerwjk:可读性很好。但由于我是在循环中组装 SQL 查询字符串,所以可读性并不重要。
    • @zerkms,Never 在这里是一个非常强烈的词。因为在这种情况下,毫无疑问,这对双方来说都更容易。它可能并不总是如此,但在这里它确实如此。
    • @developerwjk: 这样做只是因为它包含更少的令牌,而不是因为它对用户来说更具可读性。这两个事实之间没有联系。更少的令牌并不意味着它对用户来说是可读的,对用户来说是可读的并不意​​味着它有更少的令牌。
    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2017-08-18
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多