Я просто увеличил количество попаданий в БД (x2), добавив метку узла в мой запрос на шифрование? - PullRequest
0 голосов
/ 02 апреля 2019

Итак, я работаю с вашей типичной моделью данных "продукты с тегами", где узлы Product имеют свойство id, а узлы Tag имеют свойство name. К моему удивлению, мой запрос имеет гораздо больше обращений к БД, когда я включаю метку Product.

Я профилировал свои запросы на совпадения между продуктами и списками тегов различной длины.

По словам Марка Нидхэма и Петры Селмер (замечательно talk в Graph Connect Europe 2016), добавление метки Product в запросе значительно повысит производительность, поскольку мы ограничиваем пространство поиска запроса. Имеет полный смысл. Как ни странно, в начале я ~~ случайно ~~ пропустил ярлык Product. Когда я добавил в запрос, количество попаданий в БД почти удвоилось, с 5803 до 10316!

Вот запрос, который я использовал:

PROFILE MATCH (product:Product)-[:TAGGED]->(tag:Tag)
WHERE tag.name IN ["tag_1","tag_2",..."tag_N"]
WITH product, COLLECT (tag.name) AS tags_list
RETURN product.id, tags_list;

Поскольку я не могу поверить своим глазам прямо сейчас, здесь я поделюсь планами, которые вытекают из заявления PROFILE:

С меткой узла

https://drive.google.com/file/d/1dGmF_2zfKdGBtThm45MUUOkLSLCEHTYU/view?usp=sharing

без метки узла

https://drive.google.com/file/d/1efZWK6gXzNB0tjcKyhGIRFo22bDV8WjP/view?usp=sharing

Я попытался удалить операцию COLLECT в конце, но запрос без метки Product имеет еще меньше обращений к дБ, 9325 против 13837. Боюсь, я действительно новичок в Neo4j и, возможно, упускаю что-то сверх очевидное Вот. Что может привести к увеличению числа попаданий в БД при добавлении метки узла?

1 Ответ

2 голосов
/ 02 апреля 2019

Короткий ответ - да, когда у вас есть метка в вашем запросе, на нее будут попадать дБ, чтобы отфильтровать, поэтому ваши глаза не будут вас обманывать.

Тем не менее, не все дБхиты равны.Они являются абстрактными единицами работы с БД, а фильтрация меток довольно легка.

Бывают случаи, когда вы можете оставить метку выключенной, и есть моменты, когда вам действительно нужно оставить метку включенной.

Если ваша модель такова, что только: узлы продукта могут быть помеченыкак это, то вы можете опустить ярлык, так как это избыточно.Тем не менее, если есть другие типы узлов, которые можно пометить, например: «Товар является только одним из них», то вам определенно понадобится: Товарная этикетка для правильности.

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

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

...