Улучшение производительности для количества запросов - PullRequest
0 голосов
/ 08 сентября 2018

У меня на сайте есть таблица, показывающая список ссылок и количество посещений. Вот запрос шифра, который я использую, чтобы получить такие данные:

MATCH (u:USER {email: $email})-[:CREATED]->(l:URL)
OPTIONAL MATCH (l)<-[v:VISITED]-(:VISIT)
RETURN l, COUNT(v) AS count
LIMIT 10

Я создаю узел VISIT для каждого посещения для URL-адреса, чтобы хранить аналитические данные для каждого посещения. Поэтому в приведенном выше коде я беру ссылки, которые создал пользователь, и подсчитываю посещения для каждой из них.

Проблема в том, что приведенный выше запрос не выполняется. Теперь, когда объем данных огромен, для его решения требуется не менее 8 секунд.

Есть ли способы улучшить этот запрос?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

В дополнение к предложениям @ InverseFalcon вы должны либо создать ограничение индекса или уникальности на :USER(email), чтобы избежать необходимости сканировать все узлы USER, чтобы найти интересующий вас узел.

0 голосов
/ 08 сентября 2018

Для отношений: VISITED, если они только соединяют узлы: VISIT с узлами URL, вы можете использовать функцию size() в шаблоне, исключая метку узла, которая будет получать информацию о степени из узла: URL само по себе без необходимости расширения (вы можете подтвердить это, выполнив ПРОФИЛЬ или ОБЪЯСНЕНИЕ плана и развернув все элементы, найдите GetDegreePrimitive в операции проецирования).

Кроме того, поскольку вы используете LIMIT 10 без какого-либо упорядочения, лучше выполнять LIMIT раньше, чтобы вы выполняли только последующие операции с ограниченным набором узлов, а не выполняли всю работу для всех узлов, а только сохраняя 10.

MATCH (u:USER {email: $email})-[:CREATED]->(l:URL)
WITH l
LIMIT 10
RETURN l, size((l)<-[:VISITED]-()) as count

Кроме того, как отмечает cybersam, вам абсолютно необходим индекс: USER (электронная почта), так что ищите свой конкретный: узел USER быстрый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...