首发于 Nebula 的图数据库新世界
方位讲解 Nebula Graph 索引原理和使用

方位讲解 Nebula Graph 索引原理和使用

本文首发于 Nebula Graph Community 公众号

title: "全方位讲解 Nebula Graph 索引原理和使用" date: 2022-03-24 description: "index not found?找不到索引?为什么我要创建 Nebula Graph 索引?什么时候要用到 Nebula Graph 原生索引?针对社区常见问题,本文旨在一文带大家搞清索引使用问题。" tags: ["最佳实践"] author: "Wey"

index not found?找不到索引?为什么我要创建 Nebula Graph 索引?什么时候要用到 Nebula Graph 原生索引?针对社区常见问题,本文旨在一文带大家搞清索引使用问题。

Nebula Graph 的索引其实和传统的关系型数据库中的索引很像,但是又有一些容易让人疑惑的区别。刚开始了解 Nebula 的同学会疑惑:

在这篇文章里,我们就把这些问题一一解决,方便大家更好地使用 Nebula Graph。

到底 Nebula Graph 索引是什么

简单来说,Nebula Graph 索引是用来且只用来针对纯属性条件出发查询场景的功能,它具有以下特性:

纯属性条件出发查询

我们知道在传统关系型数据库中,索引是对表数据的一个或多个针对特定重排序的副本,它用来加速特定列过滤条件的读查询并带来了额外的数据写入。简单来说,索引能起到加速的作用,但查询使用索引并非是必要的。

在 Nebula Graph 图数据库里,索引则是对点、边特定属性数据重排序的副本,用来提供纯属性条件出发查询

以如下边的查询为例,该语句实现了从指定点边属性条件,而非点的 ID 出发的方式去获取图数据:

上边这两个纯属性条件出发查询就是字面意思的”根据指定的属性条件获取点或者边本身“ ,反面的例子则是给定了点的 ID。参考以下例子:

我们仔细看前边的 query 1query 3,尽管语句中条件都有针对 tag 为 player 的过滤条件 { name: 'Tim Duncan' },但一个需要依赖索引实现,一个不需要索引。具体的原因在这里 :

其实,这里的关键就是在于是查询是否存在给定的顶点 ID(Vertex ID),下边两个查询的执行计划里更清晰地比较了他们的区别:

图注:query 1 的执行计划(需要索引);

图注:query 3 的执行计划(不需要索引);

为什么纯属性条件出发查询里必须要索引呢?

因为 Nebula Graph 在存储数据的时候,它的结构是面向分布式与关联关系设计的,类似表结构数据库中无索引的全扫描条件搜索实际上更加昂贵,所以设计上被有意禁止了。

但,如果你不追求全部数据,只要采样一部分,3.0 里之后是支持不强制索引 LIMIT <n> 的情况的,如下查询(有 LIMIT)不需要索引:

为什么只有纯属性条件出发查询需要索引

在这里,我们比较一下正常的图查询 graph-queries 和纯属性条件出发查询 pure-prop-condition queries 实现方式:

而在 Nebula Graph 里,graph-queries 在扩展的时候,图的原始数据已经按照 VID(点和边都是)排序过了,或者说在数据里已经索引过了,这个排序带来连续存储(物理上邻接)使得扩展游走本身就是优化过能快速返回结果。

总结:索引是什么,索引不是什么?

索引是什么?

索引不是什么?

一些 Nebula Graph 索引的设计细节

为了更好理解索引的限制、代价、能力,咱们来解释更多他的细节

这些信息可在我的个人网站的#手绘图和视频#(链接: siwei.io/sketch-notes/)里可以看到,参考下图:

因为左匹配的设计,在复杂查询场景,比如:针对纯属性条件出发查询里涉及到通配、REGEXP,Nebula Graph 提供了全文索引的功能,它是利用 Raft Listener 去异步将数据写到外部 Elasticsearch 集群之中,并在查询的时候去查 ES 去做到的,具体全文索引使用参见文档: docs.nebula-graph.com.cn

在这个手绘图中,我们还可以看出

结论:

索引的使用

具体要参考 Nebula 官方的索引文档: docs.nebula-graph.io/3. 一些要点是:

第一点,在 Tag 或者 EdgeType 上针对想要被条件反查点边的属性创建索引,使用 CREATE INDEX 语句;

第二点,创建索引之后的索引部分数据会同步写入,但是如果创建索引之前已经有的点边数据对应的索引是需要明确指定去创建的,这是一个异步的 job,需要执行语句 REBUILD INDEX

第三点,触发了异步的 REBUILD INDEX 之后,可用语句 SHOW INDEX STATUS 查询状态:

第四点,利用到索引的查询可以是 LOOKUP,并且常常可以借助管道符在此之上做拓展查询,参考下面例子:

也可以是 MATCH,这里边 v 是通过索引得到的,而 v2 则是在数据(非索引)部分拓展查询获得的。

第五点,复合索引的能力与限制。理解原生索引的匹配是左匹配能让我们知道对于超过一个属性的索引:复合索引,并且能帮助我们理解它的能力有限制,这里说几个结论:


回顾

Happy Graphing!

交流图数据库技术?加入 Nebula 交流群请先 填写下你的 Nebula 名片,Nebula 小助手会拉你进群~~

关注公众号

代做工资流水公司无锡贷款工资流水 模板阜阳打印在职证明嘉兴办理房贷收入证明镇江企业银行流水制作惠州查询入职工资流水保定做银行流水PS湘潭收入证明报价肇庆收入证明代做嘉兴贷款工资流水 办理曲靖对公银行流水报价柳州开消费贷流水许昌企业对私流水报价无锡查询银行流水修改大庆对公账户流水模板厦门打印企业流水打印兰州房贷流水公司邢台贷款流水多少钱长沙银行对公流水办理江门代做银行流水修改柳州在职证明多少钱济宁转账银行流水费用宿迁银行流水开具济宁企业贷流水代做沈阳消费贷流水代办沈阳打个人工资流水银川代办银行流水账单岳阳打银行流水电子版烟台代办对公流水汕头工资银行流水报价铜陵开房贷银行流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化