INDEX第二列是否需要在WHERE子句中使用?

时间:2012-03-05 13:28:29

标签: mysql sql select indexing

考虑使用

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

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

想象一下,第一部分匹配10条记录,并添加第二部分过滤5条记录。是否还需要INDEX第二列?

4 个答案:

答案 0 :(得分:5)

您正在谈论短路评估。 DBMS具有基于成本的优化器。 没有保证两种条件都将首先得到评估。

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

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

答案 1 :(得分: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

答案 2 :(得分:2)

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

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

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

您可能需要尝试并测量多种方法。

答案 3 :(得分:1)

您没有INDEX第二列,但它可能会加快您的SELECT