Я согласен с общим ответом: используйте поисковик, такой как Sphinx (и ограничьте количество возвращаемых результатов); они предназначены для того, чтобы делать именно то, что вы хотите.
Однако, несмотря на то, что миллионы записей могут звучать как много, вы должны сначала определить, что занимает много времени. Я очень люблю Sphinx и ThinkingSphinx - они принимают довольно сложный процесс и делают его довольно простым и легким. Но, в конце концов, поисковая система - это еще одна система для управления, настройки, обучения и знания. Если вам не нужно идти туда, проще не делать, верно?
Это может быть запрос, это может быть время, потраченное на возврат данных (limit
ваш друг!). Или может случиться так, что вы получаете сотни запросов в секунду, возможно, потому что задержка при автозаполнении слишком короткая - если поиск происходит по каждому символу, быстрые машинистки или несколько пользователей могут легко перебежать сервер с запросами, которые не предоставляют утилиты для пользователя.
Посмотрите журналы Rails и посмотрите, что на самом деле происходит. Если это простая проблема производительности запросов, выполнение сложного полнотекстового поиска, тогда, да, это будет медленно, и Сфинкс будет стоить усилий. В вашей базе данных есть инструмент explain
, который после некоторой работы поможет вам понять, что делает база данных, чтобы получить результат. Нередко индекс не привыкает.
А как насчет кеширования? Memcached - фантастический инструмент. Или, может быть, даже только настройки размера буфера для базы данных позволят ей использовать больше памяти для кэширования.