什么是索引?

  索引是一种数据结构,用于提高查询数据的效率,类似目录,索引也是占用磁盘空间,主要以文件形式存在与磁盘中。

索引的优缺点

优点

  • 提高查询语句的执行效率,减少IO操作的次数
  • 创建唯一性索引,可以保证每行数据的唯一性
  • 加入索引的列会进行排序,在使用分组和排序子句进行查询时,可以显著减少查询的分组排序时间

缺点

  • 索引占用物理空间
  • 创建与维护索引要耗费时间,数据量越多,所费时间越久
  • 数据更新时(增删改查)也会伴随者索引的动态维护,降低了数据的更新效率

分类

主键索引

主键索引是特殊的唯一索引,不能为空值。

唯一索引

唯一索引控制每行数据的唯一性,可为空,但不重复。

普通索引

没啥特殊的索引,用于提高查询效率而存在,可为空,也可重复。

单列索引

索引的列数量为一个

组合索引

将多个列作为索引,用于组合搜索,效率大于索引合并。注意:需满足最左匹配原则,如果想要使用少于组合索引字段数在where条件上,必须有组合索引里的第一个字段,但是与顺序无关。

全文索引

全文索引只能建立在文本字段上,但这列非常长是,使用文本索引要比like进行模糊查询快的多,因为全文索引会进行预处理,将文本分割成token_text,contains运算通过token_text进行匹配查找,进而提高模糊查询速度。注:全文索引有自己的模糊索引语句和like语句不同,且结果可能也会不同。

前缀索引

只能建立在文本内容,用于减少存储空间,根据情况来定,长了太占空间,短了不起效果,正如前缀索引字意,选取列的前部分作为索引。

存储模型

哈希表

key用于存储索引列,value为每行数据的物理地址。哈希表会存在不同的索引通过hash函数换算后出现同一个值的现象,此时结构变为了链表。hash表存储无序,插入数据快,但不适合范围查询。

有序数组

将索引排序存储于有序数组中,可以通过二分查找来进行快速查找,适合范围查询,但是更新数据会根据移动的其它元素数量决定更新速度,不适合数据的更新,因而适合存储一些不变的元素,例如过去的年份数据。

二叉搜索树

又叫二叉排序树,学过数据结构的应该知道,最大的问题是没有做到平衡,会出现O(n)的坏情况。

平衡二叉树

做到了平衡,但是查询速度与树的层次有关,索引不止存在内存中,还会写在磁盘上,树的层次越多,IO就越多,效率就会变低,同时范围查询时,可能会出现重复从根结点遍历的情景,效率低下。

B树

将二叉树变为多叉树,