MySQL可以为单个查询使用多个索引吗?

kol*_*pto 45 mysql indexing database-indexes

想象一下,有一个包含多列的表格id, a, b, c, d, e.我通常选择id,但是,客户端应用程序中有多个查询使用各种条件而不是列的子集.

当MySQL在多个列上具有多个WHERE条件的单个表上执行查询时,它是否真的可以使用在不同列上创建的索引?或者,使其快速的唯一方法是为所有可能的查询创建多列索引?

Ker*_*mit 59

是的,MySQL可以为单个查询使用多个索引.优化器将确定哪些索引将使查询受益.您可以使用EXPLAIN获取有关MySQL如何执行语句的信息.您可以使用如下提示添加或忽略索引:

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;
Run Code Online (Sandbox Code Playgroud)

我建议阅读MySQL如何使用索引.

只是一些摘录:

如果在多个索引之间有选择,MySQL通常使用找到最小行数的索引.

如果col1和col2上存在多列索引,则可以直接获取相应的行.如果col1和col2上存在单独的单列索引,优化程序将尝试使用索引合并优化(请参见第8.3.1.4节"索引合并优化"),或尝试通过确定哪个索引找到更少的索引来查找限制性最强的索引行并使用该索引来获取行.

  • 哇,这是新的东西,或者我在文档中设法错过了.谢谢,这很有意思:)无论如何,针对特定情况的多列索引应该更高效. (4认同)

Chr*_*nry 19

传统上,MySQL可以在给定查询中为每个表引用使用一个索引.但是,在MySQL的更新版本中,index merge可以发生一个名为an的操作,并允许MySQL为每个表使用多个索引.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

  • 我认为你应该编辑它:*"每个表可以使用一个索引**引用**"* (5认同)

sau*_*abh 9

Mysql可以使用index merge来合并两个索引的结果。但这并不是 mysql 的首选方式。如果可以优化查询执行,它将使用两个索引。但这也是查询开发人员创建复合索引的一个提示。

\n\n

索引合并绝不等同于复合索引。\n这里摘录自 Baron Schwartz 的书 -

\n\n
\n

索引合并策略有时效果很好,但\xe2\x80\x99 更常见,因为它实际上表明索引不良的表:

\n\n

\xe2\x80\xa2 当服务器与索引相交时(通常用于 AND 条件),通常意味着您需要包含所有相关列的单个索引,而不是必须组合的多个索引。
\n \xe2\x80\xa2 当服务器联合索引时(通常用于 OR 条件),有时\n 算法\xe2\x80\x99 的缓冲、排序和合并操作会使用大量 CPU\n 和内存资源。如果并非所有索引都具有很强的选择性,则尤其如此,因此扫描会向合并操作返回大量行。

\n
\n


Ric*_*mes 5

  • SELECT查询中的每个查询(think UNION、子查询、派生表等)都是单独优化的。也就是说,每个可能使用不同的索引。
  • 人们SELECT 可以在所谓的“索引合并”中使用多个索引。这个很少用到。
  • EXPLAIN说它使用时Index merge (intersect),它几乎总是可以通过使用包含交叉索引所使用的列的复合索引来改进。
  • Index merge (union)有时(很少)用于OR. 这也许可以通过将查询重写为UNIONof 2来改进SELECTs