数据库索引

237 阅读4分钟

索引是一种数据结构,由原始数据派生而来的,适当的索引可以加快读取查询,但所以都会减慢写速度。所以对索引的选择和使用,需要权衡设计。这里我们去了解索引有哪些类型,这些类型各自有哪些优缺点。

一、哈希索引

哈希索引最简单的策略是,在内存中保存hash map,每个键映射到数据文件的一个特定的字节偏移位置,这样就可以定位到每个值的位置。

Image.png

哈希索引可以快速索引数据,但是不适合范围查找,而且哈希表需要放在内存中,如果系统崩溃了,就会出现数据丢失问题。另外,哈希索引还有哈希冲突的问题。

有些索引结构,能够摆脱这些限制,它们分别是SSTable和LSM-Tree。

SSTable是排序字符串表的简称

SSTable会使用到类CSV格式来存储key-value,再用内存中的hash map来索引,而key-value就用来索引数据文件。简单结构如下:

未命名文件.png

SSTable会采用只追加一个文件的形式,这会导致磁盘空间耗尽的情况,所以会采用将日志文件分段,这些数据文件端可以在执行压缩和合并,形成更简单的文件端,这些可以由后台线程进行处理。SSMTable整体如下:

Image.jpg

SSTable在哈希表有所改进,比如key采用有序方式,使得SStable适合范围查找。使用这种索引结构的存储引擎工作如下:

1、当写入时,采用平衡树,时内存表有序

2、当内存表大于阈值时,将其作为SSTable文件写入磁盘

3、处理读请求,先从内存表查,查不到再从最新的磁盘段文件(第2步的)查找,找不到再去次新的磁盘段文件找,以此类推

4、后台进程周期执行合并和压缩,丢弃已被删除的数据

LSM-Tree

SStable和内存表是Google的Bigtable论文引入的,这个索引结构最初是日志结构的合并树(Log-Structured Merge-Tree,简称LSM-Tree)命名,后续基于合并和压缩排序文件原理的存储引擎通常称为LSM存储引擎

二、B-Tree

B-Tree相对常见,很多中间件都适用它作为索引实现,B-Tree的特点,首先是键有序,比如在一个页里,所存储的键,都是按顺序排列,而这个页所引用的其他页按照左边小,右边大的特点分布。

Image.png

B-Tree的叶子结点还关联了其他叶子结点,这样使范围查找更方便,更快,这是hash索引无法相比的一个优点。

通常,B-Tree的深度在3,4层,所以索引起来很快。我们知道,要维护这样的树,有时候会比较麻烦,比如插入时,结点分裂,删除时结点合并,,还要保持平衡(因为B-Tree也是一种平衡树),比如红黑树,它的删除比插入要复杂得多。

三、其他索引

上面的哈希索引和B-Tree索引属于K-V类型索引结构,另外这里还有其他索引分类

1、聚集索引

聚集索引,是将索引行直接存储在索引中。这个特点很明显,比如MySQL的主键,就是聚集索引,决定了表的物理结构。

2、非聚集索引

比如二级索引,像普通索引,是引用主键,通过主键再回查数据行。

3、覆盖索引:介于聚集索引和非聚集索引 

这是一种折中设计,在索引中不仅保存了主键,也保存了表的一些列值,这种通过索引也能得到某些简单的查询结果

4、多列索引

像组合索引,通过在多列上建立索引,并且满足最左匹配原则,这种也可以在索引上得到部分列的信息。

5、全文索引

目前所了解的全文索引做得比较好的,就是ElasticSearch,一个搜索数据库,了解不多。