YashanDB索引介绍
索引是数据库系统中的一个独立对象,是表的一个可选结构,它包含了表的部分列数据,并且这些数据是有序的。给表创建合适的索引相当于给表创建了一个目录,可以显著提高该表关于索引列的访问效率。
一、索引的优点
- 减少I/O开销:表的数据是随机存储的,如果表上没有索引,查询需要执行全表扫描才能获取结果,这意味着数据库需要访问这个表的每个数据块,从而带来大量的I/O开销。而索引可以使得查询只需访问部分数据块,甚至可能不需要访问数据块,从而减少了I/O开销。
- 提高查询速度:在表的某一列或某几列上创建了索引后,执行关于该索引列或包含索引列过滤的查询时,可以基于索引快速定位到所需的数据,从而显著提高查询速度。
二、索引的缺点
- 额外的空间开销:索引是一个独立对象,创建索引会带来额外的空间开销。
- 增加DML语句的执行开销:由于索引需要随着表的变动而变动,因此在插入、删除、更新表数据时,也需要对索引进行相应的维护操作,这会增加DML语句的执行开销。
- 可能的性能损失:虽然创建合适的索引可以带来业务的极大性能提升,但如果滥用索引,则可能会导致业务性能下降。例如,过多的索引会导致插入、删除、更新操作变慢,同时也会占用更多的存储空间。
三、索引的可用性和可见性
- 可用性:索引可以是可用(usable)的,也可以是不可用(unusable)的。YashanDB在DML操作中不维护不可用索引,且优化器也不会选择不可用索引执行查询操作。当一个索引从可用状态变更为不可用状态时,YashanDB会把这个索引对应的segment删除,即不可用索引不会占用物理空间。不可用索引或索引分区可以通过rebuild语句调整状态为可用。
- 可见性:索引可以是可见(visible)的,也可以是不可见(invisible)的。YashanDB在DML操作中依然维护不可见索引,但优化器不会选择不可见索引执行查询操作。在调整业务时,可以通过设置索引的可见性来测试索引对业务性能的影响。
四、唯一索引和非唯一索引
- 唯一索引:要求索引列的每个值唯一,即不允许重复值(NULL除外)。通常按照索引列排序,如果唯一索引列全NULL则按照RowId排序。
- 非唯一索引:不要求值的唯一性。在索引值不同时按照索引列排序,索引列值相同时则按照RowId排序。
五、索引的存储
索引是一个独立对象,有单独的segment。索引segment的表空间默认是索引所有者的默认表空间,在创建索引或重建索引时,可以自定义指定索引的表空间。索引中的行与表一一对应,用于存储索引列的值以及对应表中的行RowId,索引严格按照索引列的值(值相同时按照RowId的值)有序存储。
六、BTree索引
BTree索引是YashanDB中常用的一种索引类型,它通过维护一个B树数据结构来保持索引的有序性。
- 分支块和叶子块:BTree索引存在两种数据块:存储索引列数据的叶子块和存储路由信息(用户查找)的分支块。叶子块之间使用双向链表串联。
- 索引扫描:BTree索引的高度决定了查找任意索引列数据需要访问的数据块数量。YashanDB支持多种索引扫描方式,包括全索引扫描、索引快速全扫描、索引范围扫描、索引唯一扫描和索引跳跃扫描等。
七、索引的维护
索引是表的一个可选结构,跟随表的变动而变动。当表插入、删除、更新数据时,索引也需要进行相应的维护操作。特别是当表更新索引列时,为了保持索引的有序性,索引不能像表那样在原位更新,而是先删除老数据构造的索引行然后在合适的位置插入新值构造的索引行。
八、特殊索引类型
- 反向索引:反向索引在存储值时,会按照字节序逆转后的结果存储(索引列顺序不变)。这有助于在特定情况下(如自增列作为索引列时)分散索引值,避免索引倾斜。但反向索引丧失了普通BTree索引范围查询的能力。
- 升序索引和降序索引:默认情况下,YashanDB创建索引会按照索引列值从小到大来进行存储(升序索引)。同时,YashanDB还支持降序索引和组合索引(对组合索引的索引列分别设置升序或降序)。
- 函数索引:YashanDB支持用户基于函数或与基表相关某个或多个列的表达式来创建索引(函数索引)。当查询中包含函数索引的表达式时,可以使用该函数索引加速查询。
九、索引聚集因子
索引聚集因子描述了索引对应表数据块的有序程度。表数据越有序,索引聚集因子越小,扫描的代价越小。如果索引聚集因子比较高,则说明在大型索引范围扫描过程中,YashanDB可能会需要执行较高数量的I/O;反之,如果索引聚集因子比较低,则说明在大型索引范围扫描过程中,YashanDB只需要执行较低数量的I/O。
以下是BTree索引相关图片展示:
综上所述,YashanDB提供了丰富多样的索引类型和索引操作方式,以满足不同场景下的查询需求。在创建和使用索引时,需要根据实际情况选择合适的索引类型和索引策略,以达到最优的查询性能。