Разница в производительности в Couchbase получить по ключу и выбрать по индексу - PullRequest
0 голосов
/ 28 ноября 2018

Поскольку мы проводим тесты производительности в нашей базе данных Couchbase, мы попытались сравнить поиск элементов по их id / key и поиск элементов по запросу, использующему вторичный индекс.

После этой статьи о индексирование и производительность в Couchbase мы думали, что производительность обоих будет одинаковой.

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

Например, ~ 3 мс для поиска по индексу и ~ 0,3 мс для поиска по ключу (это в 10 раз больше)

Дело в том, что эта разница не состоит.Поиск по ключу варьируется от 0,3 мс до 15 мс.

Интересно:

  1. Должна ли быть более высокая производительность при поиске по ключу по поиску по вторичному индексу?
  2. Должна ли быть такая разница во времени между поисками ключа?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Чтобы добавить к ответу @ deniswrosa, вторичный индекс всегда будет медленнее, потому что сначала необходимо найти индекс на основе вашего запроса, чтобы найти ключ документа, а затем выполнить поиск ключа.Выполнение только поиска ключа происходит быстрее, если у вас уже есть ключ.Объем работы по обходу индекса может варьироваться в зависимости от того, насколько избирателен индекс, находится ли весь индекс в памяти и т. Д. Оптимизированные для памяти индексы могут гарантировать, что весь индекс находится в памяти, если у вас достаточно памяти для поддержки этого..

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

0 голосов
/ 30 ноября 2018

Можно достичь вторичных поисков менее миллисекунды в масштабе, но это требует некоторой настройки вашего запроса, индекса и, возможно, некоторых системных параметров Couchbase.Рассмотрим следующий простой пример:

Пример документа в userBucket:

"user :: 000000000001": {"email": "benjamin1@couchbase.com", "userId": "000000000001"}

Этот запрос:

ВЫБЕРИТЕ userId ИЗ userBucket WHERE email = "benjamin1@couchbase.com" И ИДЕНТИФИКАТОР НЕ НУЛЕЙ;

... должен быть в состоянии выполнитьпроизводительность менее миллисекунды с правильно настроенным вторичным индексом:

CREATE INDEX idx01 ON userBucket (электронная почта, userId);

Поскольку индекс полностью покрывает запрос, нет необходимости в механизме запросовПОЛУЧИТЬ документ из магазина K / V.Однако «SELECT * ...» всегда будет вызывать службу запросов для извлечения документа и, следовательно, будет медленнее, чем простое k / v GET («user :: 000000000001»).

Для обеспечения максимальной задержки обязательно просмотрите план запроса (используя синтаксис EXPLAIN) и убедитесь, что ваш запрос не FETCHing.https://docs.couchbase.com/server/6.0/n1ql/n1ql-language-reference/explain.html

0 голосов
/ 28 ноября 2018

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

Всякий раз, когда вы сохраняете новый документ, хеш couchbaseключ и назначить ему виртуальное ведро (что-то похожее на осколок).Когда вам нужно вернуть этот документ, он использует тот же алгоритм, чтобы выяснить, в каком виртуальном контейнере находится документ, поскольку SDK имеет карту кластеров и точно знает, какой узел имеет какие сегменты, ваше приложение будет запрашивать документ напрямую.узел, которому он принадлежит.

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

О ваших вопросах о результатах от 0,3 мс до 15 мс трудно сказать без отладки среды.Однако есть ряд факторов, которые могут этому способствовать.Пример: документ кэшируется / не кэшируется, узел имеет меньший размер и т. Д.

...