Оптимизация Sphinx

Недавно в ходе работы столкнулся с медленной выборкой новостей из Sphinx. Выборка не сложная - это фильтрация по атрибутам и сортировка по дате. Записей около 500 000. Для Sphinx такой объем данных не помеха, однако выборка происходит за 300мс. Начал разбираться.

Первым делом добавил в настройку sphinxd строки для логирования всех запросов в формате sphinxql.

 

query_log = /var/log/sphinx/query.log

 

query_log_format = sphinxql

 

В логе увидел запрос:

 

SELECT  FROM news WHERE active=1 AND deleted=0 AND date_start BETWEEN 0 AND 1479880515 AND date_finish BETWEEN 1479880515 AND 1893445200 ORDER BY date_start DESC LIMIT 0,100 OPTION max_matches=300000, ranker=none;

 

Первым делом обратил внимание на параметр max_matches, данная опция задает максимальное количество найденных записей хранимых в оперативной памяти. Здесь есть нюанс, при таком запросе изначально произойдет фильтрация данных, затем сортировка, после этого происходит урезание результата запроса в соответствии с параметром limit. Если LIMIT 0,1000 , а max_matches = 100, то запрос вернет 100 записей, а это неверно. Поэтому max_matches должно быть равно offset+limit.

 

После того как изменил параметр max_matches, время запроса сократилось вдвое. Однако 150 мс не предел для Sphinx. Покопавшись на форумах, я попробовал применить опцию reverse_scan=1. Время запроса сократилось до 60 мс. Опция reverse_scan позволяет контролировать порядок сканирования строк при поиске. В данном случае поиск начался с конца индекса. Такое ускорение времени запроса было связано с тем, что данные в индексе лежат в порядке возрастания даты создания новости, а запрос запрашивает последние свежие новости.

К сожалению SphinxClient для php не поддерживает установку опции reverse_scan.

Единственный способ установить данную переменную - использовать SphinxQL.

 

В процессе поиска решения по оптимизации sphinx наткнулся на несколько вариантов решений, которые можно прочитать в первоисточниках:

https://dzone.com/articles/making-code-faster-the-obvious-costs

https://www.percona.com/blog/2013/01/15/sphinx-search-performance-optimization-attribute-based-filtering/

http://chakrygin.ru/2013/07/sphinx-tips-and-tricks-2.html


comments powered by Disqus