一、聚集索引:Innodb存储引擎的索引
1、主键索引:所有数据都存储在主键索引上,使用主键查找效率非常高
2、辅助索引:辅助索引上存储的是主键值,查询整行数据需要先通过此索引找到主键,再通过主键索引找到对应的数据,因为只有主键上有整行数据。如果只查询id和name,那此索引name可以找到id,就不需要再去查主键索引。所以有时会通过建立联合索引查找数据,联合索引上包含了需要的所有数据,如果不包含所有需要的数据,那么联合索引的意义就不大,还是需要去查主键索引。
二、非聚集索引:MyISAM存储引擎的索引
1、主键索引:主键索引上存储的是整行数据的地址,也就是说索引和数据是分开存储的;
2、辅助索引:索引上也是存储数据地址
总结:
1、Innodb和MyISAM存储引擎使用B+树结构存储,所有数据都存储在叶子节点上,从左到右从小到大,非常方便查找和范围取值;
2、MEMORY/HEAP存储引擎:支持HASH和B+树索引,memory主要用于临时表;
3、不同的存储引擎会使用不同的索引;
4、Innodb必须有主键,主键和数据放一起存储;因为数据必须挂在主键上,如果没建主键,mysql会建立一个虚拟主键,用于挂载数据;辅助索引存储主键值,再通过主键获取数据;
5、MyISAM索引和数据分开存储,主键索引和辅助索引都是存储数据的地址;
备注:https://mp.weixin.qq.com/s/cOdvz3SPltNQsm-C2Cyd0A
包括:hash、二叉树、红黑树、AVL树、B树、B+树的特性,以及其他数据结构不适合作为索引的原因
hash:没办法进行范围查找
二叉树:容易倾斜
红黑树:也有倾斜问题
AVL树:一个节点只有一个数据,查找数据从磁盘上查找,效率低
B-树:索引存在于叶子节点和非叶子节点,非叶子节点也需要存有数据,这样会导致相同大小索引块上存储的索引变少
B+树:所有关键数据都在叶子节点上,并且都是有序的,各叶子节点是有序的链表结构,非叶子节点不存储数据只存储索引,数据都放在叶子节点存储,这样索引节点上存储的索引就更多,读入一个索引块,能查找的数据更多,减少磁盘的IO。