Для условий фильтрации в сочетании с логическим И, как в вашем запросе, оптимизатор запросов ArangoDB выберет один индекс. По этой причине он не выбрал индекс кромки и индекс пропуска одновременно.
Он будет выбирать между индексом пропуска на expired
и индексом края на [ "_from", "_to" ]
, и выберет тот, для которого он определяет более низкую стоимость, которая измеряется оценками селективности индекса. Как видно из вывода объяснения, похоже, что он выбрал индекс края на _to
.
Индекс края внутренне состоит из двух отдельных хэш-индексов, одного для атрибута _from
, а другого для атрибута _to
, поэтому он обеспечивает быстрый доступ через атрибуты _from
и _to
. Однако это не комбинированный индекс для [ "_from", "_to" ]
, поэтому он не поддерживает запросы, которые одновременно запрашивают _from
и _to
. Он должен выбрать один из внутренних хеш-индексов и, похоже, выбрал тот, который находится на _to
в этом запросе. Решение снова основывается на средней избирательности индекса.
Невозможно предоставить оптимизатору подсказку об использовании индекса - кроме этого, он не сможет использовать два индекса одновременно для этого конкретного запроса.
Глядя на оценку селективности в выходных данных объяснения, кажется, что индекс ребер не очень избирательный, что означает, что будет много ребер с одинаковыми значениями _to
. Поскольку оптимизатор также должен был принять во внимание индекс на _from
, я бы предположил, что индекс еще менее избирательный, и что каждый из этих индексов поможет пропустить не более 50% краев, что не очень много. Если это действительно так, то запрос по-прежнему будет извлекать (и выполнять последующую фильтрацию) множество документов, что объясняет потенциальную медлительность.
В настоящий момент атрибуты _from
и _to
автоматически индексируются в всегда присутствующем индексе края коллекции краев, и они не могут использоваться в дополнительных, определяемых пользователем индексах. Это функция, которую мы хотели бы добавить в будущую версию, потому что с _from
и _to
, доступными для определяемых пользователем индексов, можно было бы создать комбинированный (отсортированный) индекс на [ "_from", "_to", "expired" ]
, который потенциально был бы намного более избирательным, чем любой из три отдельных индекса с одним атрибутом.
person
stj
schedule
04.01.2016