让MySQL为每个表使用多个索引

时间:2014-04-06 23:10:41

标签: mysql indexing

我记得在某处读过MySQL每个表只能使用1个索引进行SELECT查询,我不知道对于最新版本的MySQL是否仍然如此。我无法找到有关该主题的任何内容。

我尝试在具有多个索引的表上优化查询,但EXPLAIN表示它只使用了其中一个索引。我尝试使用FORCE INDEX(index1,index2),但这不起作用。有没有办法强制MySQL在表中使用多个索引?

我正在使用MySQL 5.6.15。

1 个答案:

答案 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仅在非常特殊和罕见的情况下使用这些优化。
在其他情况下,可以使用组合索引(多列上的单个索引)