l 新桶大小
新桶大小为比当前桶大小大的最小素数。
l 桶访问锁
对于每个线程,在初次访问索引时都会分配一个桶访问节点,该节点上设置了当前的桶地址,以及一把互斥锁。在线程开始访问索引时,先申请访问节点上的锁,访问结束释放锁。通过该锁确保索引访问过程中,桶资源不会因为rehash被释放。
l 异步重建
桶重建是一个异步过程,重建桶过程中,并不影响索引的查询以及更新。该过程通过记录当前迁移位置来影响访问旧桶,还是新桶。当数据迁移完毕,并且没有对旧桶的访问时(没有线程持有该桶的桶访问锁),对旧桶资源进行释放。
3.9 索引与锁
为了避免过多的锁占用系统过多资源,以及保持较高的并发度,AntDB-M数据库的每个Hash索引都分配有131个锁,通过桶下标与131取模来获取当前索引记录的锁。在访问索引(查询或者修改)过程中都会先加锁。
4. 索引特性
4.1 前缀索引
前缀索引是指适用指定列,或者指定列的指定前缀长度做为索引。
这种特性适用于以下两种情况:
1. 索引列数据过长
2. 索引列部分的数据,适用于特定业务查询的场景。
AntDB-M还可以指定每列的前缀长度,而不仅仅是最后一列的前缀长度,这就为业务提供了非常灵活的索引能力,方便客户实现更高效、响应速度更快的业务落地。
4.2 数据分布
对于每个Hash索引,都会统计当前位置下Hash值相同记录个数。
该统计值,主要用来判断当前数据是否存在较大的Hash冲突。便于AntDB-M的运维管理人员快速定位,是否适合建立Hash索引,是否需要进一步优化Hash索引。
5. 限制约束
5.1 不支持范围查询
对于Hash索引,由于索引记录本身不排序,因此不支持范围查询。
注意:对索引列字段的范围查询,都会进行全表遍历。
5.2 不支持模糊查询
AntDB-M支持固定长度的左前缀匹配。但由于Hash计算本身需要精确值,因此不支持模糊匹配。
5.3 索引列不应有太多相同值
如果有较多的列有相同值,这些记录将位于同一个索引记录链表中,每次查询都将遍历该列表所有记录进行筛选,数据越多,性能越低。
6.总结
正是Hash索引这种简洁的设计,让AntDB-M数据库能够以较少的内存和计算,即可提供高效的索引能力,在提升数据库的访问性能的同时,大幅降低了系统资源的开销。但Hash索引算法也存在一些使用上的限制,主要是由于其本身的特性,了解这些特性,可以帮助业务模型设计人员选择合适的索引类型,以最大化提升数据库的性能。
关于AntDB数据库
AntDB数据库始于2008年,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。