索引模型: hash,有序数组,搜索树
1,hash: key,value存储。存储结构类似于Java7 的hashmap。 同一节点使用链表的形式存储。适合单个等值查询,不适用于范围查询
2,有序数组:按从大到小有序存储,类似于链表。等值,范围查询使用二分 时间复杂度Olog(N),查询效率搞。但插入一条数据都要,移动后面的所有数据。适用于静态存储引擎
3,搜索树:树结构,查询时间复杂度O(log(N)),更新时间复杂度O(log(N)).
数据库大都不适合使用二叉树,层级会非常高,每一层存放在一个数据页中,100万节点的平衡二叉树,树高20,需要访问20个数据块,每个数据快的寻址大概需要10ms.查询耗时比较长.
搜索需要查多次磁盘(从磁盘随机读取一个数据块,需要10ms左右的寻址时间)。
innoDB引擎的索引。B+树
innoDB的索引模式也可以称之为N叉树,这个N大概为1200。N叉树的高度一般不超过4,当高度为4时,其可以存储的数据为1200的三次方,大概为17亿。这样查询一个值最多只需要访问3次磁盘。
而且树的第二层,有很大的概率在内存中,这样大大提升了查询效率。
innoDB的数据存储在B+树的叶子节点,按主键顺序存储。相当于主键索引,也称之为聚簇索引。
非主键索引,也称之为二级索引。二级索引也是一颗B+树,按索引字段排序。
二级索引的查找数据过程,先通过普通索引查出数据对应的主键,在通过主键查询整行信息(查询数据不仅是主键时)(回查聚簇索引,称之为回表)
如果查询的数据只是主键id,不需要回表,因为通过二级索引已经可以查询到主键信息。称之为覆盖索引。
注意:每次数据调整,都需要调整每颗树的结构。在索引过多时,每次新增需要调整的数据结构就更多。
固索引当按需创建,杜绝无效索引。
另外索引支持最左前缀原则,like 'li%' 这种形式可以支持索引。
索引下推 联合查询时,先在索引中过滤完成之后再回表取数据