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
第一个字段一定有序,如果使用第二个字段的索引,必须先使用第一个字段,而且必须保证第二个字段有序。怎么保证呢?
即当第一个字段为等值匹配时才能保证第二个字段有序。

浙公网安备 33010602011771号