索引的本质
索引是为了高效获取数据排好序的数据结构
索引的目的
如果没有索引,那么你是通过全表查询查找数据的,因为数据分散在磁盘的各个地方,所以会没有顺序的查很多次,而且每次查询都是一次磁盘IO交互,可想而知数据越来越多,查询速度会越来越慢。
如图所示,通过排好序的数据结构,获取数据会更高效。
当然索引底层并不是二叉树,这里只是大致做个形象的对比。为什么数据结构不用二叉树呢?因为二叉树在index一直递增的情况下,由于后面一个总是比前面的大,数据是单边查询的,效率也不高。
mysql索引采用的B+树
如上所述,二叉树容易单边递增,所以需要使用平衡树,但是平衡树的深度依旧太深,影响效率。所以我们改用B树的优化版本:B+树,B+树相比B树,为了放更多的索引index,它的非叶节点不存放data(存放的磁盘地址),转而放在叶节点。
如图,中间是冗余索引,最下面叶节点用指针连接,提高区间访问性能,最大能放2000万左右的索引元素。所以即使你是一张两千万数据的表,你也可以用B+树的数据结构建好索引,然后你再查询数据,效率就会很高。并且根节点往往是长期放在内存中,冗余索引则是放在缓存中。
InnoDB存储引擎主键索引
1、它的Index与data都在叶节点,这种类型的也被成为聚集索引。
2、InnoDB表必须要有主键,如果没有创建,mysql也会选择没有重复的列作为主键(从左到右的顺序),如果都是重复的列,也会生成一个rowId作为主键。
3、推荐使用整型的自增主键,因为String类型的比较影响效率,如果不是自增主键,那么Index中间插入,会导致节点分裂和重新平衡,影响效率。
联合索引
最经典的就是要符合最左前缀原则,如图,如果sql的where条件后面没有第一个字段,那么第一个字段就没有过滤,相当于全表查询,自然就没有走索引了。
附:数据结构互动学习网站