WolandV
@WolandV
Программист

Как добиться хорошей производительности в Sphinx?

Добрый день!
Существует механизм, который использует индекс в sphinx не для полнотекстового поиска. То есть, по факту это просто табличка с некоторым количеством простых полей (только int).

Довольно простой запрос с элементарным фильтром по этой табличке дал довольно слабый результат, что вызвало некоторое удивление. В процессе поиска проблемы запрос был упрощен до состояния, когда дальше его упрощать некуда и все равно время выполнения запроса фантастическое:

select user_id from index limit 1;
/* Affected rows: 0  Найденные строки: 1  Предупреждения: 0  Длительность  1 query: 0,110 sec. */


Раньше другая версия этой выборки выполнялась за приемлемое время, потому что в ней присутствовала опция OPTION cutoff=X. Если эта настройка в запросе присутствует, то запрос выполняется молниеносно за 0,(0)1.
В моем же случае я эту опцию использовать не могу (или скорее могу, но не знаю как), потому что я использую обратную сортировку по полю. А опытным путем я выяснил, что в случае, если я в запросе к индексу указываю ORDER BY, то индекс сначала по какой-то своей сортировка выбирает записи из индекса по условиям из WHERE, потом обрезает эту выборку до длины, указанной в cutoff, а уже оставшиеся записи сортирует по значению, указанному в ORDER BY. Это работает молниеносно, но мне не подходит совершенно. По моим наблюдением, выборка без указания ORDER BY происходит с сортировкой по id, мне же нужно ORDER BY id DESC.
Приведу пример:
Предположим, что у нас в таблице 1000 записей с id от 1 до 1000. Если я не указываю ORDER BY, но указываю cutoff, то он сортирует по id и я получаю верный результат.
Если же мне нужно ORDER BY id DESC LIMIT 10 OPTION cutoff=10, то сначала индекс, ориентируясь на cutoff возьмет первые 10 записей (id от 1 до 10), а уже их отсортирует в обратном порядке и вернет мне этот результат.

У меня была первая версия, что индекс строится по неправильной сортировке, но я перепроверил конфиг и убедился, что и сам index и его дельта-индекс в своем sql_query содержат правильную сортировку.

Соответственно, я не могу за приемлемое время по нужной мне сортировке выбрать данные.

Заранее благодарю за ответы!
  • Вопрос задан
  • 352 просмотра
Пригласить эксперта
Ответы на вопрос 2
@postgree
Могу предположить, что идет фулскан индекса, т.к. сфинкс при фильтрации по атрибутам, без поиска просмотрит весь индекс, рассчитает все значения, попадающие под условие, отсортирует, наложит лимиты и вернет результат. Т.к. после каждого запроса можно получить мета информацию. Благодаря такому механизму можно выводить пагинацию без дополнительного запроса count(*). И да, мне кажется вы не для того кейса используете инструмент. Если все же очень надо, придется с этим смириться.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
ну вы интсрумент используете не по назначению, такие вещи будут работать с правильными индексами и в обычном mysql
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы