写点什么

四问复合索引,让你的数据查询速度飞起

  • 2023-09-27
    广东
  • 本文字数:1688 字

    阅读完需:约 6 分钟

四问复合索引,让你的数据查询速度飞起

本文分享自华为云社区 《华为云GES持久化图数据库复合索引介绍》,作者:村头树下。


本文章主要介绍索引的作用,以及如何实现这种功能,希望可以帮助理解索引的作用以及如何使用索引

1. 什么是复合索引


复合索引是用户手动建立的用于加速查询的一类额外数据。详细参数可以参考规格文档

https://support.huaweicloud.com/api-ges/ges_03_0454.html

2. 复合索引能做什么


复合索引有两类。一是 label 索引,用于加速 label 的扫描。二是属性索引,用于加速属性过滤。

这里列举了一些常用接口(语句)与索引的关系


3. 无索引时如何查询


首先了解无索引的情况下,查询的逻辑,才可以理解索引在此基础上做了什么使得查询能够加速。查询逻辑主要与两个方面有关:数据结构,以及数据访问方式,以及查询场景。

a) 原始点结构


持久化版本所有数据都是以 KV(键值对)的方式存储在分布式 KV 数据库中,在没有建立索引的时候,数据库中仅有原始点边 KV。以点数据结构为例:


Key: 



Value:



key 的开始部分为 kVType,这是所有数据都会存在的固定前缀,用以区分不同类型的数据。然后是 Vid 是全局唯一点 id。Labelid 是标识 label 的内置编码。Value 则是属性的数据。

b) 数据访问方式


所有的图数据的查询最终都是依托于 KV 数据库的访问。常用的访问 KV 数据的方式有两种:


  1. 精确查询接口,指定完整的 key 查询 value

  2. 前缀查询接口,仅指定 key 的前缀部分,查询所有 key 的前缀匹配的 KV 数据对。前缀查相对来说会更加频繁的使用。一个场景可能会需要多次前缀查,而前缀查的次数越多,结果越多,相应的此场景响应速度就越慢。前缀查结果大小直接与前缀的长度有关,前缀越长或者越精确,那么前缀查的结果越少。需要的计算量也越少。相应速度就会越快。

c) 查询场景:


常见查询场景的对应的 kv 层接口调用:



可见,除了指定 id 的查询,其他所有查询均非常慢。这些查询都需要进行全图点扫描加过滤的方式来获取结果。这与查询出来的结果数目无关。对于较大的图来说,这样的查询代价是十分巨大的。

4. 复合索引如何加速


查询慢的场景无外乎两种场景,label 查询或者属性查询。在没有索引的情况下,这两种查询都是建立在全局点扫描的基础上,进行过滤。当有效数据占比越低(例如全局点 1w,目标点仅有 1 个),这种扫描方式就越显得不划算。


对于这两种场景,我们可以建立对应的索引。索引本身也是 KV 数据。所以其 key 的布局就决定了其功能。


1.对于 label 过滤场景,索引的 key 的格式为:



对于每一个点,都会有一条对应的 Label 索引 KV。


当需要过滤特定 Label 时,可以拼出 KVType+Label 的前缀,利用 kv 数据底座的前缀查接口,就能直接将所有符合条件的点过滤出来。


2. 对于属性过滤的场景,索引的 key 格式为:



属性索引只针对个别过滤较为频繁的属性而建立。所以也只会对包含此属性的点才会生成属性索引 kv。相比于 Label 索引这里只是多了一个 property 字段。此字段填的是 Vid 对应点的属性的值。需要注意的是,property 字段并不包含全部的点属性,仅仅是待过滤属性的值。


当进行属性查询时,由于知道目标值(例如 where n.prop=1,目标值就是 1)。直接拼出 KVTypr+Label+Property,调用前缀查询接口。即可查出所有符合条件的点。


当利用索引查出匹配的索引 KV 之后,就可以很方便的拿到对应的 VId。然后根据此 Vid,就能快速查询到这个点的属性,或者邻居等信息。

5. 索引建立的若干建议


索引并不是没有代价的,虽然它能加速查询,但是会降低写操作的性能,以及耗费更多的磁盘空间。所以建立索引之前需要考虑是不是必要的。这可以从数据区分度,数据大小,以及访问频率三个方面来评估。


  • 数据区分度:对于属性索引建议在过滤性好的属性上建立。值分布较为分散,比较适合建立。例如身份证号,手机号。但是对于性别这种属性,就不建议为此建立。对于 label 索引,如果图里面只有一个 label,那么建 label 索引其实也是没有什么必要的,但是大部分情况,label 索引都是必要的。

  • 数据大小:这主要是针对属性索引来说的,在已经有 Label 索引的前提下,如果某个 label 下的点边数目很少,即使扫描所有 label 代价也不高,这时候没有必要再为其建立属性索引。

  • 访问频率:这一点很好理解,只对频繁在 where 子句中出现的属性建立索引。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 6
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
四问复合索引,让你的数据查询速度飞起_后端_华为云开发者联盟_InfoQ写作社区