Как то раз увлекся ускорением поиска в эластиксерч
На одном проекте у нас был поиск по Elasticsearch, около 27 млн документов Для каждой компании свои шаблоны и регулярки, иногда до 40 штук Пользователь нажимал кнопку и ждал Иногда секунд 90, иногда дольше Можно было отвлечься на чай, но хотелось все-таки найти документы :) Сначала пошел разбираться с полями и индексами Пробовал n-граммы, сравнивал варианты, перешел с keyword на wildcard Стало лучше, примерно 45-70 секунд Уже успеваешь сделать чай, но выпить придется после поиска :) Потом задумался: а зачем мы при каждом запросе заново проверяем документы по тем же правилам? Документы те же, правила никто не менял, а работа каждый раз начинается сначала После нескольких итераций перенес проверку на момент загрузки документа Проверяем его по правилам и сохраняем, каким компаниям он подходит При поиске используем уже готовый результат Если добавляется или меняется правило, пересчитываем совпадения для него, остальные заново не гоняем Первоначально обработать накопленные документы было дорого, зато потом обычный поиск, по моим наблюдениям, стал укладываться примерно в 10 секунд, редкие сложные запросы доходили до 20 Точных замеров под рукой нет, поэтому цифры примерные Конечно, появилась новая забота: следить, чтобы сохраненные совпадения оставались актуальными При изменении правил это теперь тоже наша ответственность Но больше всего мне запомнилось, сколько времени я сначала потратил на ускорение самой проверки, прежде чем спросил себя, как часто ее вообще нужно выполнять У вас бывало, что долго оптимизировали код, а потом выяснялось, что его можно просто реже запускать? :)