Mysql中关于联合索引的几点说明

现在有一张表User:

三个字段,uid,uname,uage

其中uid是主键,然后为uname和uage添加联合索引

CREATE TABLE `User` (
  `uid` int(11) NOT NULL,
  `uname` varchar(20) DEFAULT NULL,
  `uage` int(3) DEFAULT NULL,
  PRIMARY KEY (`uid`),
  KEY `index_all` (`uname`,`uage`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

EXPLAIN SELECT * from `User` WHERE uage='40' and uname='老李';

 

查询使用到了联合索引,type=ref

EXPLAIN SELECT * from `User` WHERE uage='40';

 

虽然uage是联合索引的一部分,但是直接使用uage进行检索,使用到的索引却是index.

-- 如果直接使用第二个字段作为检索条件,通常是用不上联合索引的,如果字段本身是单列索引或者联合索引的一部分,
-- 索引类型是index,这种索引类型在表中从第一个索引开始到最后一个逐个匹配,直到找到符合条件的。
-- ref这种类型会根据算法快速定位,不会一行行扫描。

 

联合索引的使用必须符合最左前缀原则:

1.尽管我们在sql中故意把uname,uage和定义索引的位置写反了,它仍然使用联合索引进行检索,这是因为在执行查询前,mysql对sql进行了优化,使它在真实执行时变成这个样子:

EXPLAIN SELECT * from `User` WHERE uname='老李' and uage='40';

 2.对于联合索引,执行顺序时从左到右依次匹配,相当于 order by uname,uage

第一个字段一定有序,如果使用第二个字段的索引,必须先使用第一个字段,而且必须保证第二个字段有序。怎么保证呢?

即当第一个字段为等值匹配时才能保证第二个字段有序。

posted @ 2018-04-15 10:33  一介書生  阅读(595)  评论(0)    收藏  举报