【发布时间】:2015-03-11 19:08:24
【问题描述】:
在我当前的 nodejs 应用程序中,我使用 Neo4j 作为数据库并使用它的 REST API。通过运行我的单元测试,我发现我有两个运行速度非常慢的测试,并将其追踪到密码查询是导致性能不佳的罪魁祸首。现在虽然性能仍然很慢,但对于我的本地开发机器上的用例来说,至少第一个案例在大约 300 毫秒内运行在一个可以接受的时间。 但是,第二个查询增加了一整秒,直到我得到结果(在我的例子中只有两行)。唯一的区别是我使用的是 DESC 而不是品牌名称的 ASC 排序。
查询 1
MATCH (Distributor {slug: "some-dist"})-[:SELLS]->(product:Product)-[:IS|:BELONGS_TO*0..5]->(Category {slug: "electrical"}),
(product)-[:HAS_BRAND]->(brand:Brand)
RETURN DISTINCT brand ORDER BY brand.name ASC
查询 2
MATCH (Distributor {slug: "some-dist"})-[:SELLS]->(product:Product)-[:IS|:BELONGS_TO*0..5]->(Category {slug: "electrical"}),
(product)-[:HAS_BRAND]->(brand:Brand)
RETURN DISTINCT brand ORDER BY brand.name DESC
关于图表的一些数据:
- 4 个分发节点
- ~600 个品牌节点
- ~1500 个类别节点
- ~30000 个产品节点
所有 slug 属性都具有唯一性的约束。 Brand name 的 name 属性也被索引。
为什么,第二个查询慢得多,我该如何解决?
【问题讨论】:
-
增加混乱...“RETURN DISTINCT brand.name ORDER BY brand.name DESC”比“RETURN DISTINCT brand.name ORDER BY brand.name ASC”快,时间差不多与上述原始问题的区别
-
您查看
PROFILE输出了吗?哪个应该向您显示查询创建的中间行数和 db-hits?在 2.2 之前的 neo4j-shell 和从 2.2 开始的浏览器中执行此操作。