索引
什么是索引?
索引是一种数据结构,用于提高查询数据的效率,类似目录,索引也是占用磁盘空间,主要以文件形式存在与磁盘中。
索引的优缺点
优点
- 提高查询语句的执行效率,减少IO操作的次数
- 创建唯一性索引,可以保证每行数据的唯一性
- 加入索引的列会进行排序,在使用分组和排序子句进行查询时,可以显著减少查询的分组排序时间
缺点
- 索引占用物理空间
- 创建与维护索引要耗费时间,数据量越多,所费时间越久
- 数据更新时(增删改查)也会伴随者索引的动态维护,降低了数据的更新效率
分类
主键索引
主键索引是特殊的唯一索引,不能为空值。
唯一索引
唯一索引控制每行数据的唯一性,可为空,但不重复。
普通索引
没啥特殊的索引,用于提高查询效率而存在,可为空,也可重复。
单列索引
索引的列数量为一个
组合索引
将多个列作为索引,用于组合搜索,效率大于索引合并。注意:需满足最左匹配原则,如果想要使用少于组合索引字段数在where条件上,必须有组合索引里的第一个字段,但是与顺序无关。
全文索引
全文索引只能建立在文本字段上,但这列非常长是,使用文本索引要比like进行模糊查询快的多,因为全文索引会进行预处理,将文本分割成token_text,contains运算通过token_text进行匹配查找,进而提高模糊查询速度。注:全文索引有自己的模糊索引语句和like语句不同,且结果可能也会不同。
前缀索引
只能建立在文本内容,用于减少存储空间,根据情况来定,长了太占空间,短了不起效果,正如前缀索引字意,选取列的前部分作为索引。
存储模型
哈希表
key用于存储索引列,value为每行数据的物理地址。哈希表会存在不同的索引通过hash函数换算后出现同一个值的现象,此时结构变为了链表。hash表存储无序,插入数据快,但不适合范围查询。
有序数组
将索引排序存储于有序数组中,可以通过二分查找来进行快速查找,适合范围查询,但是更新数据会根据移动的其它元素数量决定更新速度,不适合数据的更新,因而适合存储一些不变的元素,例如过去的年份数据。
二叉搜索树
又叫二叉排序树,学过数据结构的应该知道,最大的问题是没有做到平衡,会出现O(n)的坏情况。
平衡二叉树
做到了平衡,但是查询速度与树的层次有关,索引不止存在内存中,还会写在磁盘上,树的层次越多,IO就越多,效率就会变低,同时范围查询时,可能会出现重复从根结点遍历的情景,效率低下。
B树
将二叉树变为多叉树,