neo4j - Neo4J 对巨大数据库的查询非常慢
问题描述
我有一个包含 29M 节点和 43M 关系的数据库
我需要进行查询以查找艺术家的姓名
MATCH (a:Artist) WHERE toLower(a.name) CONTAINS toLower("John") AND a.group=false
WITH a
OPTIONAL MATCH (a)-[b:IS_SUBSCRIBED]->(c:Company)
WITH a, c
OPTIONAL MATCH (a)<-[f:HAS_MEMBER]-(g:Artist)
WITH a, c, collect([g.name, g.aid]) as groups
RETURN a.name AS name, a.aid as id, c.number as aie_number, c.email as email, groups
ORDER BY a.name
LIMIT 200
所以我有一些艺术家可能订阅了一家公司,并且可能是某些团体的成员。我需要获取该信息,当我进行查询时,这需要很长时间,超过 6 秒,在我看来有点慢,我已附上个人资料
有没有一些技巧可以提高性能?
我有艺术家姓名的索引和 :Artist(name, group) 的索引
在此先感谢您的帮助
解决方案
问题是,尽管您有一个索引,因为您在比较之前对属性进行了toLower
操作,但该索引并未被使用。name
配置文件显示的第一步NodeByLabelScan
。它正在对该name
属性进行全表扫描。
:Artist
在您的节点上创建一个名为 的新属性name_lower
,将其设置为toLower(name)
,索引该属性并在搜索中使用它。这将极大地提高查询的性能。
推荐阅读
- android - ViewPager2 与 SwipeRefreshLayout 冲突
- python - 如何在python中制作二项式CDF?
- outliers - Apache Druid:计算异常值
- javascript - Laravel Ajax 分页链接在第二页单击时刷新
- java - 如何使注入的 objectmapper 输出特定于语言环境
- javascript - react native - 将导航道具从父级传递给子级
- c++ - 如何使用 Visual Studio 2019 中当前项目中的预处理器定义重新编译引用的静态库?
- javascript - 水平滚动时 HTML 表格内容与另一个静态内容重载
- php - 如何使用 WP_REST_Server::CREATABLE 插入 MySQL 数据库?
- ffmpeg - 如何确保使用 -c:v copy 在 ffmpeg 中进行修剪是准确的