【问题标题】:IN(1, 2...n) query optimizationIN(1, 2...n) 查询优化
【发布时间】:2010-03-03 22:43:59
【问题描述】:

据我所知,如果使用 IN(1, 2...n) 查询,mysql 不使用索引。我错了吗?或者我可以做些什么来让mysql使用它?我不是指 IN() 子查询优化,因为这在手册中有明确的解释。

示例(假设所有字段都有一个索引,名为 index_abc):

WHERE a = 1 AND b = 2 AND c = 3 - 然后它使用 index_abc

WHERE a = 2 AND b IN (2, 4, 5) AND C = 3 - 那么它不会

提前感谢您的帮助。

【问题讨论】:

  • 如果我不使用explain,我怎么能自信地写出它使用索引和不使用索引的情况......从学习手册背诵?别傻了。逻辑也是你的朋友。
  • 你能把这两个查询的 EXPLAIN 的结果发给感兴趣的人吗?

标签: sql optimization mysql


【解决方案1】:

是什么决定了IN 表达式中的值来自哪里?奇怪的是它要么是用户输入,要么是应该在某个地方的表格中。应该在表中的内容示例包括硬编码的查找值。甚至用户输入也可以首先插入到某处的表格中。然后你可以使用JOIN 而不是IN,你的索引就可以正常工作了。

【讨论】:

  • 这些值在应用程序中进行评估。但可以肯定的是,这是一种方法——确定是否可以使用 sql 评估它们。感谢您的建议。
【解决方案2】:

here 描述了 MySQL 可以使用索引的所有情况。我没有看到那里。将您的查询重写为(b = 2 OR b = 4 OR b = 5) AND c = 3,这应该使mysql使用索引。我认为这只是因为 mysql 不够聪明:)

【讨论】:

    【解决方案3】:

    我同意乔尔的观点。

    尽可能避免使用 IN 语句。 (在大多数情况下,它们可以被 JOINS 替换。)使用 IN 语句是一个已知的性能缺陷。另请注意,IN 语句在(大多数?)数据库上具有最大允许成员数。

    【讨论】:

      【解决方案4】:

      发布您的解释确实会有所帮助。尝试添加 FORCE KEY(keyname) 到您的查询中,看看它是否解决了您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 2011-09-18
        相关资源
        最近更新 更多