Оптимизация производительности запросов Redis-Graph (соответствие)
Я хочу сохранить большой график в Redis и пытался сделать это с помощью RedisGraph. Чтобы проверить это, я сначала создавал тест-график для проверки характеристик производительности. График довольно мал для тех целей, которые нам нужны.
- Вершины: около 3,5 миллионов
- Края: около 18 миллионов
И это очень ограничено для наших целей, нам нужно было бы увеличить это до сотен миллионов ребер в одной базе данных. В любом случае я проверял требования к пространству и производительности, остановленные после загрузки только в вершинах, и увидел, что производительность для:
GRAPH.QUERY gid 'MATCH (t:token {token: "some-string"}) RETURN t'
Более 300 миллисекунд только для этого поиска, что абсолютно недопустимо.
Я упускаю очевидный способ улучшить производительность поиска или это ограничение RedisGraph?
Спасибо
2 ответа
Добавление индекса значительно ускорит процесс сопоставления.
CREATE INDEX ON :token(token)
Исходя из моих исследований, я думаю, что для создания индекса должен существовать хотя бы один экземпляр элемента, но я не делал никаких цифр по дополнительным затратам на раннее создание индекса и последующее добавление большинства новых узлов, а не после того, как все элементы в дереве, и они могут быть проиндексированы в массовом порядке.
В случае, если все узлы помечены как "токен", тогда redisgraph должен будет сканировать 3,5 миллиона объектов, сравнивая каждый атрибут "токен" объекта со значением, которое вы указали ("some-string")
для ускорения я бы порекомендовал либо добавить индекс, либо ограничить количество результатов, которые вы хотели бы получить с помощью LIMIT.
Также стоит упомянуть, что первый запрос, который должен быть обработан, может занять больше времени, чем последующие, из-за управления внутренней памятью.