以mysql为例详解ToplingDB 的 UintIndex

 更新时间:2022年08月19日 10:13:14   作者:雷鹏  
本文主要介绍了以mysql为例详解ToplingDB的UintIndex,在ToplingDB的CO-Index(Compressed Ordered Index)家族中,Nest Succinct Trie是最通用的,更多相关内容需要的朋友可以参考一下

前言

在 ToplingDB 的 CO-Index(Compressed Ordered Index) 家族中,Nest Succinct Trie 是最通用的。但是,伴随通用的,往往是低效。我们针对一些特殊场景,采用了特殊的实现,用以提高性能……

这里面,最特殊的一类 Index,就是 UintIndex,顾名思义,就是 Key 为 unsigned int 时的 index。

以 MySQL 为例

在 MySQL 中,我们往往会建立这样一个表:

CREATE TABLE Student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) INDEX,
    dorm_id INT INDEX,
    -- others ...
);

这里的 PRIMARY KEY 最终体现到 MyRocks,是这样的形式:

PrefixIDid

通过配置,我们可以通过 keyPrefixLen 将 PrefixID 分离出去,这样,Index 中就只剩下一个 id 字段了,并且,在 SST 中,这些 id 往往都是比较紧密的范围(被删除的 id 是范围中的空洞),比如,在某个 SST 中,存储的 id 范围是 1,000,000~2,000,000。

并且,我们知道,CO-Index 会将用户 Key(在这里就是 id 字段) 映射到一个 内部ID,再用这个 内部ID 去访问 PA-Zip……

在一个 SST 中,把这一切串起来,我们就能使用简单且高效的方式来实现 Index 了:

图中的 ValueOrd 就是前面说的 内部ID,Index 共有 108 个 Key,BitMap 中有 MaxKey - MinKey + 1 = 229 个 Bit。

  • 如果这个范围中,一个空洞也没有,那么,Index 中我们只需要保存 id 的最大最小值。
    • 内部ID = Student.id - MinStudentID
  • 如果这个范围中,只有极少数的空洞,那么,Index 中我们只需要保存那些空洞 中的 id
    • 内部ID = Student.id - (Hole num before this Student.id)
  • 如果这个范围中,有相当数量的空洞,那么,Index 中我们只需要保存一个 BitMap,其中相应 bit 的含义是这个 id 是否存在
    • 利用 Rank-Select 的思想:内部ID = BitMap.rank1(id)

进一步,在概念上,如果我们把 一个空洞也没有 和 只有极少数的空洞 也用 Rank-Select 来表达:

那么,这三种情况,在形式上就可以统一起来!实际上,在代码实现中,这三种不同的 Rank-Select 实现是作为模板类 UintIndex 的模板参数的,在保持抽象的同时,又不损失性能。

应用到 MongoDB

在 MongoDB 中,也存在类似 MySQL Student.id 这样的东西:

MongoDB 有两大类 Key Value 数据,RecordStore(即 Collection) 和 Index:

这样,MongoDB 的 RecordStore 也可以利用 UintIndex

压缩率 & 性能

压缩率自然不用说,UintIndexAllOne 的压缩率接近于无穷大,压缩率最差的 UintIndexBitMap,其压缩率也在 30 倍以上!

性能,最关键的是性能,相比传统的块压缩,Nest Succinct Trie 最大的性能劣势在于顺序扫描(从头至尾顺序扫描,定位到某个点然后接着顺序扫描),因为对于 Nest Succinct Trie,即便是顺序扫描,它的计算也很复杂,并且内存访问非常随机。而对于 UintIndex,事情就简单多了,比 Nest Succinct Trie 会快 100 倍以上,而其中占比最大的性能开销,实际上是函数调用本身!

到此这篇关于以mysql为例详解ToplingDB 的 UintIndex的文章就介绍到这了,更多相关mysql UintIndex内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Centos7使用yum安装MySQL及实现远程连接的方法

    Centos7使用yum安装MySQL及实现远程连接的方法

    因为MySQL被Oracle收购,目前推荐使用mariadb数据库。下面通过本文给大家分享Centos7使用yum安装MySQL及实现远程连接的方法,感兴趣的朋友一起看看吧
    2017-07-07
  • MySQL数据库约束详解

    MySQL数据库约束详解

    mysql常见约束有:1、非空约束“not null”;2、唯一性约束“unique”;3、主键约束“primary key”;4、外键约束“foreign key”;5、默认值约束“Default”等等。
    2022-10-10
  • mysql下float类型使用一些误差详解

    mysql下float类型使用一些误差详解

    我想很多朋友都不怎么会在mysql中使用float类型,特别是用到金钱时我们可能会用双精度来做,我们知道mysql的float类型是单精度浮点类型不小心就会导致数据误差
    2012-11-11
  • Mysql8.0不存在mysql.proc表的解决

    Mysql8.0不存在mysql.proc表的解决

    MySQL 8.0中官方移除了proc表,MySQL 5.7版本中还是存在proc表的,本文就介绍MySQL 8.0的替代方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • mysql如何分别按年/月/日/周分组统计数据详解

    mysql如何分别按年/月/日/周分组统计数据详解

    我们在用Mysql抽取数据时候,经常需要按照天、周、月等不同的粒度对数据进行分组统计,下面这篇文章主要给大家介绍了关于mysql如何分别按年/月/日/周分组统计数据的相关资料,需要的朋友可以参考下
    2022-12-12
  • MySQL性能设置

    MySQL性能设置

    网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL 系统参数的优化
    2006-12-12
  • window10中mysql8.0修改端口port不生效的解决方法

    window10中mysql8.0修改端口port不生效的解决方法

    mysql配置文件默认位置,端口号等信息需要在my.ini文件中修改,若修改安装位置的my-default文件文件或新建my.ini文件是不生效的,本文主要介绍了window10中mysql8.0修改端口port不生效的解决方法,感兴趣的可以了解一下
    2023-11-11
  • Mysql联合查询UNION和Order by同时使用报错问题的解决办法

    Mysql联合查询UNION和Order by同时使用报错问题的解决办法

    很多朋友刚使用联合查询UNION的时候常常会理所当然的将联合查询理解为把没一个子查询的结果集组合成一个大的结果集
    2014-04-04
  • Mysql一主多从部署的实现步骤

    Mysql一主多从部署的实现步骤

    本文主要介绍了Mysql一主多从部署的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • MySQL sleep函数使用方法详解

    MySQL sleep函数使用方法详解

    sleep函数时「延时」指定时间(单位秒),也就是让程序停止执行一段指定的时间,本文就给大家简单的介绍一下MySQL sleep函数使用方法,需要的朋友可以参考下
    2023-07-07

最新评论