1.单列索引与联合索引
单列索引和联合索引都是常规索引的一种形式。
单列索引指的是一个索引只包含一个列,联合索引是一个索引中包含了多个列。
单列索引有一个不好的地方,如果我们查询的多个字段都是单列索引,那么此时只有一个索引会生效,其余的字段还需要回表查询才能拿到结果,不建议频繁使用单列索引。
在业务场景中,如果存在多个查询条件时,并且返回的字段也是查询条件中的字段,那么可以考虑针对这些查询的字段建立一个联合索引,尽量不是使用单列索引。
2.通过一组案例来观察单列索引和联合索引的差别
tb_user表中既有单列索引又有联合索引,通过这张表来演示他们的区别。
1)同时对多个单列索引查询,观察效果。
xm和lxfs这两个字段都是单列索引,我们一次性查询这两个字段,观察执行计划。
mysql> explain select * from tb_user where xm = '江睿基' and lxfs = "13900090963";
从执行计划中可以看到,该条SQL可能会用到两个索引,分别是xm和lxfs字段的单列索引,但是实际用到的只有xm字段的单列索引,从这里就可以分析出,实际上只有xm字段走了索引,lxfs字段并没有走索引,那么此时就会进行回表查询,到聚集索引中拿到数据,效率不是那么高。
2)将xm和lxfs字段做成联合索引,再观察效果。
创建联合索引。
mysql> create index idx_user_xm_lxfs on tb_user (xm,lxfs);
再次观察执行结果。
mysql> explain select * from tb_user where xm = '江睿基' and lxfs = "13900090963";
我们可以看到在可能用到的索引一列多了我们创建的联合索引,但是实际上却没有用到,用的还是单列索引,这是由于针对xm这一列既有单列索引又有联合索引,MySQL选择一个效率它认为比较高的索引。
接下来通过SQL提示的方法,建议MySQL去使用创建的联合索引。
mysql> explain select * from tb_user use index(idx_user_xm_lxfs) where xm = '江睿基' and lxfs = "13900090963";
从执行计划中已经看到使用的是联合索引,在Extra中显示的是NULL,表示的也是不回表查询,此时效率很高。
3.联合索引的B+Tree数据结构
联合索引的数据结构和单列索引的结构相差不大,只不过在一个索引元素中包含了多个列,在创建联合索引时,字段的顺序是非常关键的,谁在最左侧,谁就是最左前缀法则关键的字段,根据最左侧的索引字段依次遍历整个索引结构。
|