联合索引提高查询效率的原理
MySQL会为InnoDB的每个表建立聚簇索引,如果表有索引会建立二级索引。聚簇索引以主键建立索引,如果没有主键以表中的唯一键建立,唯一键也没会以隐式的创建一个自增的列来建立。聚簇索引和二级索引都是一个b+树,b+树的特点是数据按一定顺序存在叶子节点且每页数据相连。一般情况下使用索引查询时,先查询二级索引的b+树,查到数据并拿数据中保存的主键回查聚簇索引查到所有数据。下面我们举个例子来重现这个过程。
以下面表举例,假设表中已经存了部分数据:
create table `user_info`(`id` bigint(20) NOT NULL PRIMARY KEY,`name` varchar(11),`age` int(11),`phone` varchar(20),KEY `key_name_age` (`name`,`age`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
假如我们想要查找名字为zhaoliu,年龄为30的人的信息。即name=‘zhaoliu’,age=30
(1)先查二级索引,先用二分法查找发现在wangwu名字的右边
(2)读取右边的这页的数据到内存,二分法查到数据2个name为zhaoliu人。
(3)继续二分法比较age查到数据id=31
(4)id=31回查聚簇索引先用二分法查找发现在31右边
(5)读取31左边这页数据到内存,二分法查到数据并返回数据
如果你仅仅查找id,name和age数据那么这样就用到了覆盖索引,这样就不用回查聚簇索引,在第(3)步直接返回数据即可。