Оптимизация 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
http://chakrygin.ru/2013/07/sphinx-tips-and-tricks-2.html
comments powered by Disqus