提到数据库索引, 我想你并不陌生, 在日常生活中会经常接触到.比如某一个sql查询比较慢, 分析完原因后, 你可能就会说”给某个字段加个索引吧”之类的解决方案.但到底什么是索引, 索引又是如何工作的呢?
数据库索引的内容比较多,索引是数据库系统里面最重要的概念之一, 一句话简单来说, 索引的出现就是为了提高数据查询的效率, 就像书的目录一样.一本500页的书, 如果你想快速找到其中的某一个知识点, 在不借助目录的情况下, 那我估计你可得找一会, 同样, 对于数据库的表而言,索引其实就是它的目录.
索引的常见模型
索引的出现是为了提高查询效率, 但是实现索引的方式却有很多种, 所以这里也就引入了索引模型的概念.可以用于提高读写效率的数据结构很多, 这里介绍三种常见的数据结构, 他们分别是哈希表, 有序数组和搜索树.
下面我主要从使用的角度, 为你简单分析一下这三种模型的区别.
哈希表是一种以键-值(key-value)存储数据的结构, 我们只要输入代查找的值即key,就可以找到其对应的值即value.哈希的思路很简单, 把值放在数组里, 用一个哈希函数把key换算成一个确定的位置, 然后把value放在数组的这个位置.
不可避免地, 多个key值经过哈希函数的换算, 会出现同一值的情况.处理这种情况的一种方法, 拉出一个链表.
所以, 哈希表这种结构适用于只有等值查询的场景, 比如memcached及其他一些nosql引擎.
而有序数组在等值查询和范围查询场景中的性能就都非常优秀.如果仅仅看查询效率, 有序数组就是最好的数据结构了, 但是, 在需要更新数据的时候就麻烦了, 你往中间插入一个记录就必须得挪动后面所有的记录, 成本太高.
所以, 有序数组索引只适用于静态存储引擎, 比如你要保存的是2017年某个城市的所有人口信息, 这类不会再修改的数据.
n叉树由于在读写上的性能优点, 以及适配磁盘的访问模式, 已经被广泛应用在数据库引擎中了.
不管是哈希还是有序数组, 或者N叉树, 他们都是不断迭代, 不断优化的产物或者解决方案.你心里要有个概念,数据库底层存储的核心就是基于这些数据模型的.每碰到一个数据库, 我们需要先关注它的数据模型, 这样才能从理论上分析出这个数据库的适用场景.