我记得在某处读过MySQL每个表只能使用1个索引进行SELECT
查询,我不知道对于最新版本的MySQL是否仍然如此。我无法找到有关该主题的任何内容。
我尝试在具有多个索引的表上优化查询,但EXPLAIN
表示它只使用了其中一个索引。我尝试使用FORCE INDEX(index1,index2)
,但这不起作用。有没有办法强制MySQL在表中使用多个索引?
我正在使用MySQL 5.6.15。
答案 0 :(得分:1)
基本上,MySql在从表中检索行时只能使用一个索引。
但是,当MySql能够从单个表中扫描多个索引时,会出现特殊情况
这称为索引合并优化,详细信息在此链接下描述:
http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html
您可以在此demo中找到一些基本示例
本演示中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仅在非常特殊和罕见的情况下使用这些优化。
在其他情况下,可以使用组合索引(多列上的单个索引)