【问题标题】:Is it needed to INDEX second column for use in WHERE clause?是否需要索引第二列以在 WHERE 子句中使用?
【发布时间】:2012-03-22 23:19:37
【问题描述】:

考虑使用

获取数据
SELECT * FROM table WHERE column1='XX' && column2='XX'

Mysql 将过滤与 WHERE 子句的第一部分匹配的结果,然后与第二部分匹配。我说的对吗?

假设第一部分匹配 10 条记录,并添加第二部分过滤 5 条记录。第二栏也需要INDEX吗?

【问题讨论】:

  • 试试看,这取决于你的数据集。另外,使用 mysql 的EXPLAIN 功能。

标签: mysql sql select indexing


【解决方案1】:

您不必索引第二列,但它可能会加快您的 SELECT

【讨论】:

    【解决方案2】:

    您在谈论短路评估。 DBMS 具有基于成本的优化器。 没有保证会首先评估这两个条件。

    将其应用于您的问题:是的,索引您的第二列可能是有益的。

    • 在搜索中是否经常使用它?
    • 执行计划告诉您什么?
    • 访问模式是否会在不久的将来发生变化?
    • 该表包含多少条记录?
    • 覆盖索引会是更好的选择吗?
    • ...

    【讨论】:

      【解决方案3】:

      在处理此类查询时,RDBMS 将仅使用一个索引。在两列上都有单独的索引将允许它选择一个更快的索引。

      是否需要取决于你的具体情况。

      • 查询是否像现在这样慢?
      • 在另一列上使用索引会更快吗?
      • 一个索引包含两者会更快吗 列?

      您可能需要尝试和衡量几种方法。

      【讨论】:

        【解决方案4】:

        索引在 MySQL 中是可选的,但它们可以提高性能。

        目前,MySQL 每次表选择只能使用一个索引,因此对于给定的查询,如果您在 column1 和 column2 上都有索引,MySQL 将尝试确定最有利的索引,并且只使用一个.

        如果选择的速度至关重要,一般的解决方案是创建一个包含两列的多列索引。

        这样一来,即使 MySQL 只能对表使用一个索引,它也会使用将两列都编入索引的多列索引,从而允许 MySQL 在 WHERE 子句中快速过滤这两个条件。

        在多列索引中,您会将具有最高基数(不同值的数量最多)的列放在首位。

        为了进一步优化,在某些情况下可以应用"covering" indexes

        请注意,索引可以提高性能,但需要一些成本。索引增加了内存和存储需求。此外,在向表中更新或插入记录时,相应的索引也需要维护。实施索引时必须考虑所有这些因素。

        更新:MySQL 5.0 现在可以通过合并每个索引的结果来在多个列上使用索引,但有一些注意事项。

        以下查询非常适合Index Merge Optimization

        SELECT * FROM t1 WHERE key1=1 AND key2=1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-22
          • 2017-12-19
          • 1970-01-01
          • 2017-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          相关资源
          最近更新 更多