Я не эксперт по индексированию / производительности с ArangoDB, но недавно у меня тоже были некоторые проблемы с взаимоблокировкой, и реконструкция и изменение формы запросов давали огромный прирост производительности, иногда запросы, которые занимали 120 секунд, а затем 0,2 секунды.
Ключевым моментом, который я сделал, было помочь ArangoDB узнать, когда использовать индекс, и убедиться, что этот индекс можно использовать.
В вашем примере запроса есть проблема, из-за которой ArangoDB не знает, что происходит индекс:
FOR o IN ['pmlibrary/199340787']
FOR v,e,p IN 0..7 INBOUND o pm_child
RETURN p.vertices
Ключевой проблемой здесь является то, что ваш исходный цикл FOR использует значение из массива, что может помешать ArangoDB идентифицировать индекс. Вы можете легко заменить ваш o параметром и напрямую ввести значение 'pmlibrary/199340787'
, а с помощью кнопки «Объяснить» посмотреть, указывает ли оно, что может использовать индекс.
Одна проблема, которую я обнаружил, заключалась в попытке сделать очень понятным использование индекса, что иногда означало добавление дополнительных команд LET
, чтобы позволить ArangoDB создавать содержимое массивов, а затем, похоже, он знал, какой индекс использовать лучше.
Если бы вы должны были протестировать производительность вышеприведенного запроса, по сравнению с чем-то вроде:
LET my_targets = (FOR o IN pmlibrary FILTER o._key == '199340787' RETURN o._id)
FOR o IN my_targets
FOR v,e,p IN 0..7 INBOUND o._id pm_child
RETURN p.vertices
Это может показаться нелогичным, но при тестировании я обнаружил поразительный прирост производительности, разбив запросы на части, чтобы помочь ArangoDB заметить, что он может использовать индекс.
Если какие-либо запросы относятся к значениям в массивах или если вы используете имена динамических атрибутов, тогда он не всегда будет использовать индекс, даже если он существует.
Также я обнаружил, что сервер будет кэшировать ответ на запросы, поэтому, если вы хотите протестировать изменения в длительном запросе и хотите избежать попаданий в кеш на ваши вторые запросы +, мне пришлось остановить и перезапустить службу arangodb3.
Я надеюсь, что это поможет дать вам цель для перетасовки вашего запроса для работы с индексами.
Помните, что у вас уже есть встроенные индексы для _id, _key, _from, _to, поэтому вам нужно попробовать и убедиться, что он будет использовать другие индексы, которые могут помочь ускорить ваш запрос.
person
David Thomas
schedule
10.04.2017