我有很多标签为Person
的节点,属性为treeId
、firstName
、lastName
,我试图实现一个性能良好的所有Person的无限滚动,其中包含一些treeId,按字母顺序排列:
MATCH (p:Person {treeId: "admin"}) RETURN p ORDER BY p.lastName, p.firstName SKIP 100 LIMIT 20
**问题:**要使此操作尽可能多地在索引上运行,需要创建什么索引?
我尝试创建这样的索引:
CREATE INDEX personTreeLastNameFirstName FOR (p:Person) ON (p.treeId, p.lastName, p.firstName)
但是对于该索引,第一操作是NodeByLabelScan
,因此不使用该索引。
我尝试的另一个索引更有帮助:
CREATE INDEX personTree FOR (p:Person) ON p.treeId
第一个操作在使用时是NodeIndexSeek
,但它不包括姓名,因此需要从数据库中读取具有指定treeId的每个Person。
我需要创建什么索引,或者我需要如何重写查询,以使其在大量具有相同treeId的Person上更高效?
1条答案
按热度按时间ljsrvy3e1#
索引:
仅索引
treeId
,因此只能用于对treeIds
进行排序和搜索。综合指数:
索引
treeId
,lastName
和firstName
,但这里的陷阱是只有当所有三个索引键都出现在搜索子句中时,它才会被使用,这就是为什么你会得到NodeByLabelScan
。为了允许neo4j使用你的复合索引,你应该为firstName
和lastName
添加一些搜索条件。