我记得在某个地方,MySQL在SELECT查询中每个表只能使用一个索引,我不知道最近版本的MySQL是否仍然如此。我找不到关于这个话题的任何东西。
我试图优化一个具有多个索引的表的查询,但是EXPLAIN显示它只使用了其中的一个索引。我试过使用FORCE INDEX(index1,index2),但这不起作用。有没有办法强迫MySQL在表中使用多个索引?
我使用的是MySQL 5.6.15。
发布于 2014-04-07 05:37:16
基本上,MySql在从表中检索行时只能使用一个索引。
但是,在某些特殊情况下,MySql能够从单个表中扫描多个索引。
这称为索引合并优化,详细信息在以下链接中描述:
http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html
在这个演示中可以找到一些基本的例子
在本演示中,mytable表上有几个索引:
create index m_x on mytable( x );
create index m_y on mytable( y );有三个查询(您需要单击本演示中的view execution plan链接来查看它们的开销):
交叉口存取算法:
select *
from mytable
where x = 4
and y = 7
;
POSSIBLE_KEYS = m_x,m_y
KEY = m_x,m_y
EXTRA = Using intersect(m_x,m_y); Using where联合访问算法:
select *
from mytable
where x = 5
or y = 3
;
POSSIBLE_KEYS = m_x,m_y
KEY = m_x,m_y
EXTRA = Using union(m_x,m_y); Using where排序联合访问算法:
select *
from mytable
where x > 49 or y < 1
;
POSSIBLE_KEYS = m_x,m_y
KEY = m_x,m_y
EXTRA = Using sort_union(m_x,m_y); Using where如果在表上创建了几个索引,那么MySql总是尝试自动应用这些优化,除了创建索引之外,您不需要做任何特殊的操作来打开它们。
然而,MySql只在非常特殊和罕见的情况下才使用这些优化。
在其他情况下,可以使用组合索引(多列上的单个索引)。
https://stackoverflow.com/questions/22901165
复制相似问题