Hash Index 通常可以用来提升等值查询的定位效率,特别是对以单表精确查询为主的应用场景尤为适合。如电信业务中的并发话单查询等(特别是内存基本充足的场景)。
GBase 南大通用的8a数据库中,hash索引分为 Global Hash和分段 Hash,两者主要的区别是一个列上创建hash索引的范围不同。
Global hash索引是在整个列数据上创建一个索引,分段hash 索引是将整个列数据根据指定的dc数(key_DC_size)分为几段,每段上创建一个索引。分段hash索引主要是便于空间回收。在磁盘空间不充裕的情况下推荐分段hash索引。 现场中,使用Global Hash Index的场景较多。
分段hash索引语法举例如下:
CREATE INDEX idx_t_a ON t(a) key_DC_size = 1000 USING HASH GLOBAL;
建议:分段hash索引的Dc个数(key_DC_size)和一次查询扫描命中的dc个数相当,通常为400~2000。
南大通用GBase 8a数据库删除数据sql的实现是给被删除数据打删除标记,数据本身仍在磁盘中存在,8a的fast update模式下update sql实现是先删除原始数据行,插入新数据行。8a对于磁盘中有删除标记的数据提供了手动清除的sql:shrink space语句,即执行时将具有删除标记的数据从磁盘彻底清除,释放磁盘空间,shrink space的块级回收和行级回收模式下会同时对索引文件进行回收,即当索引文件对应的DC全都被回收删除时将该索引文件也回收删除。这种批量从磁盘删除数据的模式在大数据分析型数据库中,可以有效且大幅的提升数据库管理性能。
以shrink space的块级回收举例如下:
alter table t shrink space full block_reuse_ratio=30;
有效数据占比低于30%的DC空间进行整合回收,将需要整合回收的DC中具有删除标记的无效数据进行彻底清除,DC整合后重新落盘写seg文件,无法保证原始顺序。同时,如果有分段索引文件的数据段全部在需要整合的DC集内,则将该分段索引也回收清除,并在整合后重建该分段索引以保证索引的有效性。
在使用上,GBase8a一定是首先进行智能索引过滤的,之后,如果发现查询条件中的等值查询条件列上建立了Hash Index,则使用Hash Index,否则进行全DC扫描。这一点,可以在Trace Log中明显观察到。
对有实时数据加载的场景,可以根据实际情况设置一定时长的时间窗口,在时间窗口内先建立无索引的临时表加载数据,积累到指定时长后再将临时表内数据插入到带索引的同结构目标表中或在临时表上创建索引。一次性处理索引建立,可较大幅度的降低索引带来的维护成本。
注意事项
1、索引是一种有损的优化手段,使用索引通常会带来维护的成本,会影响数据加载及DML操作的性能,实际使用时需根据具体需求而定 。
2、选择建立hash索引的列应尽量选择重复值较少的列,否则hash冲突严重,影响hash索引的性能
3、二进制类型的列不适合使用HASH索引
4、创建索引时,只能指定单列,不能指定多列创建联合索引
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




