Neo4j: проблема производительности запроса в масштабе, даже с индексом - PullRequest
0 голосов
/ 21 июня 2019

При выполнении этого запроса на экземпляре БД с тысячами узлов и отношений у меня большое время ответа:

MATCH (user)-[:PROFILE]->(profile)-[:DATES]->(dates) 
WHERE exists(dates.endDate) 
AND datetime(dates.endDate) < datetime('2020-06-20T18:29:04.116Z') 
AND datetime(dates.endDate) > datetime('2019-10-19T18:29:04.116Z') 
RETURN user 
ORDER BY dates.endDate ASC

Я добавил индекс к датам: CREATE INDEX ON :Dates(endDate)

Но это не улучшило производительность.Есть ли проблема с самой конструкцией запроса?

1 Ответ

1 голос
/ 21 июня 2019

Индекс не будет использоваться с вашим запросом по двум причинам:

  1. Вы не используете endDate напрямую (вы передаете его функции).
  2. Вы не указали метку Dates в своем шаблоне MATCH.

Если все ваши строки endDate имеют тот же точный формат, что и '2020-06-20T18: 29: 04.116Z ', тогда фактически нет необходимости использовать функцию datetime() (которая также замедляет запрос) - вы можете просто сравнить строки напрямую.

Например,Если приведенное выше предположение верно, тогда этот запрос должен использовать ваш индекс и быть очень быстрым:

MATCH (user)-[:PROFILE]->()-[:DATES]->(dates:Dates) 
WHERE '2019-10-19T18:29:04.116Z' < dates.endDate < '2020-06-20T18:29:04.116Z'
RETURN user 
ORDER BY dates.endDate ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...