各位老铁们,大家好,今天由我来为大家分享四问复合索引让您的数据查询速度飙升,以及的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
2. 复合索引能做什么
复合索引有两种类型。一是标签索引,用于加速标签扫描。二是属性索引,用于加速属性过滤。
下面列出了一些常用接口(语句)和索引之间的关系
API接口
指数加速法
概括
扫描标签索引并统计每个标签的点数和边数
匹配(n:user)返回计数(*)
扫描点标签索引,统计标签为user的点的数量。
匹配()-[r:label]-() 返回count
扫描边缘标签索引并统计指定标签点的数量
匹配(n:user)返回n限制1
通过点标签索引快速找到带有标签用户的点
匹配(n:user) 其中n.age 10 返回n limit 1
当只有标签索引时,扫描标签索引,找到用户点,然后进行属性过滤。当存在年龄属性索引时,直接利用属性索引来定位目标点。
匹配(n:user) 其中n.age in [1, 10] 返回n limit 1
与上面相同
3. 无索引时如何查询
只有先了解没有索引的查询逻辑,才能在此基础上了解索引是做什么来加速查询的。查询逻辑主要涉及两个方面:数据结构、数据访问方式、查询场景。
a) 原始点结构
持久化版本中的所有数据均以KV(键值对)的形式存储在分布式KV数据库中。当没有创建索引时,数据库中只有原始的边KV。以点数据结构为例:
钥匙:
价值:
key的开头部分是kVType,它是一个固定的前缀,存在于所有数据中,用于区分不同类型的数据。那么Vid就是全局唯一的点id。 Labelid是标识标签的内置编码。值是属性的数据。
b) 数据访问方式
所有图数据查询最终都依赖于对KV数据库的访问。访问KV数据常用的方式有两种:
精准查询接口,指定完整的key查询值前缀查询接口,仅指定key的前缀部分,查询与所有key的前缀匹配的KV数据对。前缀查找相对来说使用得比较频繁。一个场景可能需要多个前缀搜索。前缀查询越多,得到的结果就越多,该场景对应的响应速度就会越慢。前缀搜索结果的大小与前缀的长度直接相关。前缀越长或越精确,前缀搜索结果就越少。需要更少的计算。响应速度会更快。
c) 查询场景:
常见查询场景对应的kv层接口调用:
场景
KV接口及调用次数
查询速度
对应的Cypher语句
按指定ID过滤
前缀检查*1
速度很快。由于KVType 和Vid 已知,因此可以拼出前缀。同时,一个ID一般不会有太多的标签,前缀搜索的结果也不会特别大。
match(n) 其中id(n)=‘0’ 返回n
指定标签过滤器
前缀检查
n+过滤器
米
慢的。由于Vid未知,我们只能先拼出只有KVType的前缀,然后通过前缀找出所有的点,然后对标签进行一一过滤。当点数据较多时,会有多次前缀检查,批量获取,然后过滤。
匹配(n:Label)返回n
指定标签+属性过滤
前缀检查
n+过滤器
米
慢的。查询前缀是KvType。它遍历所有图像点,先进行Label过滤,然后进行属性过滤。
匹配(n:Label) 其中n.prop=‘xx’ 返回n
指定属性过滤器
前缀检查
n+过滤器
米
非常慢。查询前缀为KvType,遍历所有地图点,对所有进行属性过滤
匹配(n) 其中n.prop=‘xx’ 返回n
可以看到,除了指定id的查询外,其他所有查询都非常慢。这些查询需要完整的地图点扫描和过滤才能获得结果。这与查询得到的结果数量无关。对于较大的图,这样的查询非常昂贵。
4. 复合索引如何加速
慢查询有两种场景:标签查询或属性查询。在没有索引的情况下,两个查询都是基于全局点扫描进行过滤。当有效数据比例较低时(例如1w个全局点,只有1个目标点),这种扫描方法的性价比就变得较低。
针对这两种场景,我们可以创建相应的索引。索引本身也是KV数据。因此,其按键的布局决定了其功能。
1、对于标签过滤场景,索引键的格式为:
对于每个点,都会有一个对应的Label索引KV。
当需要过滤特定Label时,可以拼出KVType+Label的前缀,利用kv数据库的前缀查询接口,直接过滤掉所有符合条件的点。
2、对于属性过滤场景,索引的key格式为:
属性索引仅针对过滤频率较高的单个属性创建。因此,属性索引kv 只会为包含该属性的点生成。与Label索引相比,只是多了一个属性字段。该字段填充Vid点对应的属性值。需要注意的是,属性字段并不包含所有点属性,仅包含要过滤的属性值。
在进行属性查询时,由于目标值是已知的(例如n.prop=1,则目标值为1)。直接拼出KVTypr+Label+Property,调用前缀查询接口。凡是符合条件的点都可以找到。
利用索引找出匹配的索引KV后,就可以轻松得到对应的VId。然后根据这个Vid,就可以快速查询到这个点的属性、邻居等信息。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/164675.html
用户评论
走过海棠暮
这个 TITLE 真是太棒了!我一直以来都觉得数据查询的速度实在太慢,这篇文章彻底解决了我的困惑。真的应该把这种方法推广到各个领域啊!
有17位网友表示赞同!
红尘烟雨
我曾经也遇到过类似的问题,有时候需要查询大量的数据,查询速度让人崩溃!看了这篇博文后觉得复合索引这个概念很有意思,以后一定要学习一下怎么应用。
有5位网友表示赞同!
花菲
说的没错,数据查询的速度确实关系到开发效率和用户体验。这款“四问复合索引”看起来很厉害的样子,可以加速我的代码运行?
有15位网友表示赞同!
敬情
我一直不太理解这些技术指标,不知道有没有更通俗易懂的解释?感觉标题里的“飞起”有点夸大其词啊。
有6位网友表示赞同!
自繩自縛
看了这篇文章后对复合索引有了一些了解,原来还有很多种不同的查询方式可以让我效率更高!这个东西太棒了,我马上就应用到我的项目中去!
有14位网友表示赞同!
莫失莫忘
数据查询的速度确实非常重要,尤其是当要处理的数据量庞大的时候。但这篇文章感觉讲的有点浅,希望作者能详细讲解一下每一项复合索引,以及如何选择合适的索引类型。
有20位网友表示赞同!
tina
这个标题吸引我了,我一直寻找高效数据查询的方法,这种“复合索引”听起来很有意思。文章内容很专业,我希望能够在实践中运用到这些技巧。
有9位网友表示赞同!
嘲笑!
我目前在学习数据库设计,这篇文章的介绍正好符合我的需求!希望还有更多类似的文章来讲解一些更进阶的技术细节。
有5位网友表示赞同!
栀蓝
说的的确是,数据查询速度对整个项目的性能有很大影响。复合索引是一个不错的解决方案,不过需要注意其维护成本和潜在的影响。需要根据实际情况进行评估和选择。
有17位网友表示赞同!
喜欢梅西
感觉这篇文章有点理论性太强,缺少一些实用的案例分析。希望能看到更多具体的应用场景和代码实现。
有6位网友表示赞同!
鹿先森,教魔方
我一直觉得数据查询的速度瓶颈很难突破,没想到还有这种“复合索引”这个方法存在!我要赶紧去试试看效果怎么样了。
有19位网友表示赞同!
别伤我i
对数据库优化一直不太懂,看了这篇文章后有所了解,不过觉得内容有点复杂,需要多学习和实践才能掌握。
有10位网友表示赞同!
别悲哀
文章介绍的四问复合索引听起来很方便实用,不知道实际运用中会有哪些需要注意的地方?
有9位网友表示赞同!
眷恋
我一直很关心数据库的性能优化,这篇文章提到的“飞起”确实很吸引人!希望作者能进一步详细讲解这个效果是如何实现的。
有14位网友表示赞同!
有一种中毒叫上瘾成咆哮i
这个想法很好,但是对于一些不太熟悉数据库的人来说,可能难以理解四问复合索引的概念。建议可以添加一些简单易懂的解释和案例,方便初学者入门。
有17位网友表示赞同!
Hello爱情风
数据查询速度真的会影响到整个系统的体验,所以这种高效的数据存储和查询技术非常重要。期待看到更多类似的文章,分享更深入的数据库优化技巧!
有5位网友表示赞同!
微信名字
感觉文章缺乏对不同数据结构和应用场景的区分,复合索引是否适用于所有情况?建议作者能针对不同的情况给出更具体的解决方案和指导。
有13位网友表示赞同!