Проблемы производительности Couchbase при сканировании сегмента для определенных документов - исключение тайм-аута - PullRequest
0 голосов
/ 12 ноября 2018

У нас есть Couchbase версия сервера Community Edition 5.1.1 build 5723

В нашем Cars ведре у нас есть Car Make и Cars, которые он изготовил.

Соединение между ними - это Id из Car Make, которое мы сохраняем как другое поле в документе Car (как внешний ключ в таблице MySQL).

В ведре всего 330 000 документов.

Запросы занимают много времени - десятки секунд для очень простого запроса , например

select * from cars where model="Camry"  <-- we expect to have about 50,000 results for that

Мы выполняем запросы двумя способами:

  1. Пользовательский интерфейс Couchbase
  2. Загрузочное приложение Spring, которое постоянно получает TimeOutException через 7,5 секунд

Мы думали, что проблема в отсутствующем индексе.

Итак, мы добавили индекс:

CREATE INDEX cars_idx ON cars(makeName, modelName, makeId, _class) USING GSI;

Мы видим этот индекс при запуске

SELECT * FROM system:indexes

Что нам здесь не хватает? Это разумное количество раз для таких запросов в NoSQL DB?

Ответы [ 2 ]

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

Итак, вот как мы решили проблему:

  1. Используя эту ссылку и ответ @paralen, мы создали несколько индексов, которые ускоряют запросы.
  2. Мы изменили наш код для использования нумерации страниц, когда мы знаем, что возвращаемый набор результатов будет большим, и придумали что-то вроде этого:
    do{
       Pageable pageable = PageRequest.of(pageNumber, SLICE_SIZE, Sort.by("id"));
       Slice slice carsRepository.findAllByModelName("Camry", pageable);
       List cars = slice.getContent();
    } while (slice.hasNext());
0 голосов
/ 12 ноября 2018

Попробуйте

CREATE INDEX model_idx ON cars(model);

Ваш индекс не охватывает поле модели.

И у вас должен быть индекс для свойства данных базы данных пружин "_class"

CREATE INDEX `type_idx` ON `cars`(`_class`)
...