AI 日报

分布式数据库索引能力大调研

  • By 51ITO
  • Mar 25, 2024 - 2 min read



索引,是数据库中非常重要的一类对象。在数据库中增加索引,是常见的一种优化手段,特别是对于查询语句的优化,很多都可以通过增加索引方式来解决。在分布式数据库情况下,索引又有所不同,其较单机或集中式数据库在设计、管理、优化方面有一定的差异。本文针对国内主流的一些分布式数据库,针对索引功能做了个小调研,希望对大家能有所帮助。这里特别感谢来自奥神贝斯、平凯星辰、阿里云、腾讯云、金篆信科、万里开源老师的协助。

1. 索引概述

(1)索引优点与缺点

索引作为一种可选的数据结构,可有效提升基于索引字段的查询性能,用户可根据业务自身需求进行选择。其优点非常明显,即在不修改SQL语句的前提下可以加速查询,其原理是因为通过扫描索引减少了对原表的访问,进而节省了查询IO,提升性能。但索引也不是什么“银弹”,其缺点非常明显,索引作为一种数据库的结构,只要占据存储空间并会导致数据维护成本的提高。此外,随着业务调整变化,原索引也需要人工维护。

(2)分布式下索引特殊性

在分布式数据库中,数据是采用分片方式存储,即表中的数据存在在不同节点上。在索引中需要记录索引列及对应在原表中的位置,故其使用维护成本是比较高的。而且数据的拆分情况下,数据规模减少了很多,是否还需要通过索引加速访问也值得商榷。很多单机或集中式数据库迁移到分布式数据库时,其对应的索引策略是不建议直接平移过来,需要结合分片设计做单独考虑。

(3)索引使用建议

如何更好地使用索引,有一些通用的建议:

  • 索引建立,应遵循最左前缀原则。
  • 尽量选择基数较高的字段,所谓索引字段。
  • 为经常参加过滤、关联、排序的字段创建索引。
  • 可以利用覆盖索引,有效避免回表操作。

针对分布式数据库中的索引,有些不同的建议:

  • 减少不必要的全局索引,因为其维护代价很高。
  • 在数据分片下,数据规模进一步缩小,需考虑创建索引的必要性。

2. 索引能力大对比

近些年来,国内涌现出一大批分布式数据库产品,其架构不同、功能各异。用户在使用时,面临一个普遍问题就是选型,作为重要的考察功能之一,索引也是大家非常关注的一点。这里针对国内的一些主流分布式数据库在索引功能上的情况,做了个简单调研。

TiDB中的索引都被认为是全局索引,故不存在本地索引说法。

(1)索引类型

这里谈的索引类型,是指索引是否有独立的数据分布模式。也就是说,索引是否是按照跟表相同的数据分布方式,还是自己独立一套。前者通常被称为本地索引、局部索引,后者则被称为全局索引、二级索引等。对于本地索引而言,由于其数据分布与表相同,因此如果想使用使用是需要配合分区键的,能精确定位到分区的场景。对于全局索引而言,则没有这个限制,可以按照非分区键的维度进行查询。通常全局索引也是使用在不包含分区键的多维度查询场景。当然其付出的代价也很大,每一笔数据都有可能会演化为跨机的分布式事务,对数据库的吞吐、延时等都会造成影响。这里可参考下网上一篇评测报告。因此通常建议严格区分场景,优先使用本地索引来解决,确实不能解决的再考虑全局索引,但也要严格控制全局索引的个数。从产品上来看,大部分分布式数据库产品都支持了全局索引,这也是为了迎合用户之前基于单机/集中式数据库的使用习惯。当然这里还是强调下,在分布式数据库中不能一味迁就原有的结构设计,为了获得性能与效率的平衡,是需要考虑在应用侧做些妥协的。这里需要注意的是 TiDB,因其数据天然具备的自动拆分特点,其索引都可被视为全局索引。

(2)支持表类型

在分布式数据库中,索引支持在哪些表中创建。很多分布式数据库支持创建分区表(或叫分片表),也支持创建非分区表。对应的索引是否支持在不同类型的表上创建。一般情况下,分区表上可以创建分区索引(可能是全局的或本地的),非分区表没有创建分区索引的意义。从产品来看,大部分产品都支持在不同类型的表上创建索引。TiDB 因其自身技术设计,其表都为分区表,因此不涉及这个问题。

(3)索引唯一性

唯一索引可以确保表中的某个字段(或组合)的唯一性。在分布式数据库中,由于数据分片存储,确保唯一性是个挺难的事。因此大多数情况下,唯一索引是包含分区键的组合索引,这样维护的代价相对较小。从产品上看,上述产品都支持了索引的唯一性。

(4)索引列个数

索引字段可支持一个或多个。从产品上看,上述产品都支持单键索引和复合索引。

(5)索引有序

索引作为一种有序的数据存储结构,可以按照数据升序顺序存储,也可以按降序存储,因此创建的索引就有升序索引和降序索引。在进行数据排序类访问时(如Order By),可利用索引的有序性来提升访问性能。当访问操作需要按照不同于索引排序的方式访问时(如对索引列降序访问,但只存在升序索引),有的数据库是可以利用升序索引来解决,有的则只能退化为表扫描方式解决。例如在MySQL 8.0中就支持“Backward index scan”来解决此问题。从产品来看,部分产品支持降序索引,部分产品还不支持。

(6)特殊索引

除了常规的 BTree 索引外,有些数据库还支持特殊类型的索引,这里举例如空间索引和函数索引。前者是一种用于加速空间数据的查询的特殊索引类型,主要应用于地理信息系统(GIS)和空间数据处理领域;后者则是支持对函数或者表达式做索引。这些能力无疑会扩展索引的使用范围。从产品上看,厂商能力参差不齐,特别是针对空间索引。

(7)其他能力

索引的其他能力,这里列举了几种常见的。一是索引提示,针对复杂数据访问场景或优化器尚不稳定时,提示是一种有效的应急/规避手段。上述产品也都支持了此功能。索引合并,是指 Index Merge 功能,大部分产品已经支持,少数产品还不行。索引可见性则是指优化器是否忽略该索引,这对于索引维护、系统优化有一定帮助,上述产品也都支持了。最后则是索引强一致,这也是对索引的最基本要求,也是数据库与中间件产品的差异,上述产品也都支持。