索引基础
索引概念
索引更像一个目录,通过目录可以快捷的查找到我们需要的内容
适用于做索引的数据结构
1.哈希:哈希通过哈希算法,来确定当前key所存放位置,为了避免多个key通过哈希算法所得值相同的情况,我们可以创建一个链表结构来存放哈希值相同的数据。因为不是按序存储,所以该结构不适用于查找区间内值得场景,但适用于查单一值得情况。nosql中的redis就是使用了该形式
2.有序数组:有序数组存储数据按序存储,所以更适用于区间查询的场景,但是因为该结构维护成本高,当有更新操作的数据在区间内时,就会导致所有数据做后移操作。
3.搜索树:搜索树中比较常见的有两种,二叉排序树、N叉树(InnoDB中使用的是B+树)
前置知识点:索引不止存在内存中,还要写到磁盘上
1>二叉排序树:二叉排序树在使用二分法的时候,查询效率很高,但是在InnoDB中,默认一 个数据块为一页,当数据量过大时,数据块过多,树高过高,那么磁盘的io操作也会变多,导致查 询效率变低
2>N叉树:N叉树中的N的大小取决于数据块的大小。比如一个整数字段索引:N就是16*1024/(8+6),16位数据页默认大小16kb,8位整数字段的大小8b,6为指针大小6b。此时数据量大的情况下,N叉树仍然可以保持矮胖的形态,查询时访问的数据块变少,相应的io操作变少,此时查询效率就会变高。
InnoDB中的索引模型
InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。而InnoDB使用了B+树索引模型,所以数据都是存储在B+树中。(每一个索引在InnoDB中对应一颗B+树)。假设一个表中,我们创建了两个字段,一个id,一个key,id为主键自增,key为普通索引,此时id的索引为主键索引,叶子结点存储的是整行数据。key的索引为非主键索引,也称为二级索引,叶子结点中存储的是主键的值。
主键索引的查询过程和非主键索引的查询过程是有差别的。在查询时走主键索引时,只执行一次查询操作,但是走非主键索引时,数据库引擎会先根据值查到对应的非主键索引的值,然后通过非主键索引的叶子结点所保存的主键值去走主键索引来查询,这种情况称之为回表。当我们的查询目标为主键值,查询条件为含有索引的非主键值时,因为第一次查询已经查到了我们所需要的值,所以此时称为覆盖索引。