улучшение производительности полнотекстового поиска - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть база данных MySQL с таблицей с 20 миллионами строк. Я хотел бы иметь возможность сделать свободный текстовый поиск по одному из столбцов, который является varchar (255). Сумма длины всех этих значений составляет 60 миллионов символов. В настоящее время сделать запрос, такой как:

выбрать значение из таблицы1, где совпадение (значение) с ('история');

занимает от двадцати до тридцати секунд. Что нужно сделать, чтобы запрос такого типа завершился за одну секунду или меньше?

В настоящее время это работает на VPS. Какой хардвард / софт мне стоит рассмотреть, чтобы улучшить этот поиск до 1 секунды или меньше.

Ответы [ 2 ]

3 голосов
/ 28 декабря 2011

Я полностью согласен со Станиславом здесь. Я думаю, что любая внешняя поисковая система, такая как http://lucene.apache.org/ или http://sphinxsearch.com/, будет быстрее на указанном вами размере коллекции.

Для ускоренного курса Sphinx я бы рекомендовал начать с простой настройки, описанной в http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

В вашем случае я бы добавил несколько вещей в упомянутую базовую настройку.

Используйте ранжированный запрос в исходной конфигурации, чтобы снизить нагрузку на MySQL при индексации и расширить sql_query с помощью шаблона начала / конца:

source my_source
{
  ...
  sql_query_range = SELECT MIN(id), MAX(id) FROM table
  sql_range_step  = 1000
  ...
  sql_query  = SELECT id, ... FROM table WHERE id>=$start AND id <= $end
  ...
}

Это скажет Sphinx, чтобы он выбирал до 1000 документов на запрос MySQL вместо всех записей в таблице одновременно. Если у вас более 1 млн. Записей, у вас должна быть опция.

В вашем случае это зависит от количества памяти, которое у вас есть на коробке. Я бы также увеличил mem_limit индексатора до 512M ..1024M, чтобы индексирование работало быстрее.

Когда вы играете со Sphinx, вы можете захотеть переместить некоторые запросы из MySQL в сторону Sphinx, а также добавить не полнотекстовые поля в индекс Sphinx, чтобы выполнить поиск по геодистанциям или граненый поиск, как описано в http://sphinxsearch.com/docs/current.html#attributes

2 голосов
/ 27 декабря 2011

Mysql имеет встроенный полнотекстовый поиск, который довольно ограничен в функциональности.

Я бы порекомендовал использовать специализированные полнотекстовые поисковые системы. Самым простым и дружественным к MySQL является sphinx - http://sphinxsearch.com/.. Он имеет множество библиотек для любых платформ / языков для создания и управления индексами.

Отдельная поисковая система позволит вам избежать медленных вставок в такую ​​большую коллекцию из-за обновлений индексов при каждой вставке.

...