首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >让MySQL在每个表中使用多个索引

让MySQL在每个表中使用多个索引
EN

Stack Overflow用户
提问于 2014-04-06 23:10:41
回答 1查看 27关注 0票数 0

我记得在某个地方,MySQL在SELECT查询中每个表只能使用一个索引,我不知道最近版本的MySQL是否仍然如此。我找不到关于这个话题的任何东西。

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

我使用的是MySQL 5.6.15。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-07 05:37:16

基本上,MySql在从表中检索行时只能使用一个索引。

但是,在某些特殊情况下,MySql能够从单个表中扫描多个索引。

这称为索引合并优化,详细信息在以下链接中描述:

http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html

在这个演示中可以找到一些基本的例子

在本演示中,mytable表上有几个索引:

代码语言:javascript
复制
create index m_x on mytable( x );
create index m_y on mytable( y );

有三个查询(您需要单击本演示中的view execution plan链接来查看它们的开销):

交叉口存取算法:

代码语言:javascript
复制
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

联合访问算法:

代码语言:javascript
复制
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

排序联合访问算法:

代码语言:javascript
复制
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只在非常特殊和罕见的情况下才使用这些优化。

在其他情况下,可以使用组合索引(多列上的单个索引)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22901165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档