前言
本文介绍常见的索引数据模型 , innoDB的索引模型 , 索引的维护
提示:以下是本篇文章正文内容,下面案例可供参考
一、索引数据模型
0.索引的几种类型
索引与约束不是一样东西. 索引存在的目的是为了加快检索速度
下面介绍几种索引类型
- 主键索引 , 数据不可重复,且字段数据不可为空
- 唯一索引 , 做了唯一约束的索引,字段数据可为空
- 普通索引 , 普通索引可以有多个,且值可以重复,存在仅仅是为了优化而非对字段做限制
- 全文索引 , 用于在一篇文章中检索信息
- 联合索引 , 使用
and和where
拼接多个字段进行的查询,这多个字段组合成了联合索引
1.哈希表模型
众所周知,哈希表是由键值对组成的数据结构,使用哈希表作为索引模型, 优点在于插入数据速度很快,同时因为哈希表是无序的,同时也造成了做区间查询时速度很慢
因此,哈希表模型适用于仅作等值查询的情况
2.有序数组模型
有序数组作为数据模型时 , 在等值查询和区间查询的情况下效率很高,然而在做插入,特别是主键自增的情况下,插入速度极慢 (需要遍历到表的最后一行插入数据)
因此有序数组模型适合于静态存储引擎(无需做插入,仅做查询的数据库)
3.N叉树模型
索引不仅仅是存在内存中的, 还需要写入到磁盘做长期保存
我们都知道,二叉树的搜索效率最高, 然而受限于每个结点只有两个子结点, 因此二叉树的层数就相应增加 , 当检索所需的数据块位于叶子结点时, 如果此时磁盘的读写速度又跟不上 , 那么使用二叉树模型的数据库检索速度就会极慢;
此时若使用N叉树来降低树高 , 就能较好地解决这个问题 .
优点 : N叉树在读写方面的性能均较强,且可以配合磁盘使用
二、innoDB的索引模型
innoDB才用B+树索引模型,每个索引在innoDB中对应着一个B+树 , 其中:
- 主键索引的叶子结点中存放着整行数据
- 非主键索引的叶子结点中存放着其主键索引
这就引出来一个问题 : 做查询时,使用主键索引查询还是非主键索引查询?
尽量使用主键索引 , 由于非主键索引的B+树子结点中存放着其主键索引 , 因此使用非主键查询,需要先检索非主键索引B+树,找到其对应的主键,再根据此索引检索主键B+树
三、索引维护
索引维护中有一个令人纠结的问题 , 创建主键索引时到底是使用数据唯一的业务字段还是新建一个主键自增的字段? 举例来说,是使用身份证作为主键字段还是新增一个自增字段作为主键?
先给出答案, 我们应该使用自增字段作为主键
这需要考虑到数据的字节长度, 身份证作为主键, 数据将近20个字节,而使用自增主键作为字段 , 数据仅4字节. 由此得出主键的长度应该尽可能地小