索引模型
哈希表(使用于定值查询,不适用区间范围查询)
有序数组(适用与等值查询和范围查询,要求数据时静态保存,不被修改。因为数组增删,后面的记录都要挪动)
平衡二叉树(搜索效率高,但存储不便,因为索引要存在内存和磁盘,而二叉树回了保持平衡会导致树高很高,这样每次搜索速度虽然快,但花销太大)
多叉树(多叉树可以减少树高,使得磁盘访问次数减少,速度加快)
Mysql索引模型
在mysql中,索引由存储引擎实现,不同的存储引擎索引的工作方式也不一样。
InnoDB模型
表在InnoDB中根据索引以主键顺序形式存放,使用B+树索引模型。
每个索引都以B+树形式存在。
索引分为主键索引和非主键索引。
主键索引的叶子节点存储整行数据,也叫聚簇索引。
非主键索引叶子节点存储主键的值。
主键索引和普通索引查询时的区别:
使用主键索引查询时,直接搜索主键的B+树
使用普通索引,需通过普通索引查找得出主键的值再查找主键索引的B+树(回表),普通索引需多扫描一次索引树。
由此可见,主键索引速率更高。
通常建表时建议由自增主键。
索引维护
B+树为了维护索引的有序性,再插入新值和删除时需做必要的维护。
如当前的数据也已满,此时 再插入一个在该页值范围内的值,则需要创建多一个数据页,再挪动一些数据过去,这会导致空间的利用率降低,毕竟原本只需一张数据页数据存储的数据,现在新加一个值就要增加一张数据页的空间(页分裂)
当然有分裂就有合并,当数据页的一些值被删除,符合的条件下就可以合并。
使用自增主键,能使数据页的索引保持有序的增长。
自增主键使用场景
由上面的介绍,如果使用自增主键,则索引的值一直时递增,因此索引数据页内的值不需要挪动,避免出现页分裂。
如果表里面只有一个索引那么就可以使用其作为主键索引而不用自增主键。
如果由多个索引,因为普通索引里面存储的时主键索引的值,因此主键长度越小,则普通索引占用的空间越小,因此选择自增主键更为合适。