考虑使用
获取数据SELECT * FROM table WHERE column1='XX' && column2='XX'
Mysql将过滤与WHERE子句的第一部分匹配的结果,然后使用第二部分。我是对的吗?
想象一下,第一部分匹配10条记录,并添加第二部分过滤5条记录。是否还需要INDEX
第二列?
答案 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