实践是检验真理的唯一标准,记知界后端图数据库性能优化

知界作为知识管理工具的一次探索,一直以来功能想法是我觉得可以自嗨的,但是,链上节点添加及其它保存操作的“蜗牛速度”,一想起来,我就忍不住拿数据存储选型悔不当初,面对几百万节点,这点机器资源完全不够来麻痹自己。

知界采用Neo4j图数据库作为业务模型和数据载体,因为图更容易表达知识体系,因此才有了公链和私链这两个看起来像区块链的概念,实际上它们只是用来区分知识链的私有和公开属性。图数据库在构建业务模型时,能够天然的表达实体对象关系,那么性能呢?作为验证性的产品,采用Neo4j也是一种大胆的技术决策,它能够承担起企业级产品需求吗?

在数据量超过百万后,我也持怀疑态度。产品的性能体验,不断让我产生质疑。当逃无可逃之时,静下心来仔细分析,才发现,实践是检验真理的唯一标准,诚不欺我。

最初,数据库的优化是基于查询的,通过explain分析Cypher语句,为业务实体添加了索引,查询速度得到了一定程度的优化。可是涉及到数据保存的操作,有的执行时间甚至超过了20秒,因为保存多基于SDN(Spring Data Neo4j)的API,就有了“摔锅”的理由,要么是SDN的问题,要么Neo4j选型错误,性能问题优先级后置。

但作为一款想让用户使用并且认可的产品,这显然是不可接受的。忍无可忍,开始仔细跟踪分析数据插入时生成的Cypher语句,发现保存语句在执行时需要对几百万条数据执行uwindmerge操作,采用的是NodeLabelScan策略,问题显然是因为主键没有唯一性限制。解决方法是检查记录的ID是否存在索引,如果没有则添加索引或唯一性限制:

CREATE CONSTRAINT ON (p:Node) ASSERT p.id IS UNIQUE;

或者

CREATE INDEX ON :Node(id);

此外,要尽量在Cypher语句中标注变量的Label,如:(k)--[r]--(n) 这样的语句,通过k和n的id进行定位时,同样会造成对k和n进行全节点遍历。

当然,在资源充足的前提下,读写分离也是一定要上的。

新版知界已经上线,在此版本中,除了流畅的速度(注:当前还未启用CDN加速),就是内置浏览器的性能也通过参数调整进行了优化,可以跟系统浏览器有一致的体验了。在资源浏览中,文章和课程对中英文资源进行了区分;待办事项(TODO)的条目支持多行格式及置顶、转移到其它待办事项等操作。

实践是检验真理的唯一标准,记知界后端图数据库性能优化_第1张图片

另外,新版知界上线了一个知识节点协作功能,用户可以公开私链上的某一个知识节点及其下的所有内容并邀请其他小伙伴一起协同管理。新版知界请从各应用商店下载,或访问知界安卓版‎App Store 上的“知界 - 知识信息管理平台”进行下载。

你可能感兴趣的:(前端,后端,react-native,编辑器,github)