Что обычно быстрее: поиск в файлах или выполнение запроса SQL LIKE% x% через большие двоичные объекты? - PullRequest
8 голосов
/ 08 мая 2011

Скажем, я разрабатываю инструмент, который сохранял бы фрагменты кода либо в базе данных PostgreSQL / MySQL, либо в файловой системе.Я хочу поискать эти фрагменты.Использование поисковой системы, такой как Sphinx, не кажется практичным, потому что нам нужны точные текстовые совпадения кода при поиске кода.

grep и ack и всегда отлично работал, но хранение содержимого в базе данных делает большую коллекцию содержимого более управляемой определенными способами.Мне интересно, какова относительная производительность рекурсивного выполнения grep по дереву каталогов по сравнению с выполнением запроса типа SQL LIKE или функции MySQL REGEXP для эквивалентного числа записей с объектами BLEX TEXT.

Ответы [ 4 ]

3 голосов
/ 08 мая 2011

Если у вас есть 1M файлов для просмотра, вы (насколько я знаю) просматриваете каждый из них с регулярным выражением.

Для всех намерений и целей, вы собираетесь в конечном итогеделать то же самое со строками таблицы, если вы выполняете массовый запрос к ним, используя оператор LIKE или регулярное выражение.

Мой собственный опыт работы с grep заключается в том, что я редко ищу что-то, что не содержит хотя бы одного полного словаоднако, таким образом, вы можете воспользоваться базой данных, чтобы уменьшить набор, в котором вы ищете.

MySQL имеет встроенные функции полнотекстового поиска, но я бы рекомендовал, потому что они означают, что вы 'Вы не используете InnoDB.

Вы можете прочитать о них из Postgres здесь:

http://www.postgresql.org/docs/current/static/textsearch.html

После создания индекса для столбца tsvector, вы можете выполнить "grep "в два шага, один для немедленного поиска строк, которые могут иметь неопределенную квалификацию, а затем другой по вашим истинным критериям:

select * from docs where tsvcol @@ :tsquery and (regexp at will);

Это будет значительно быстрее, чем все, что может сделать grep.

1 голос
/ 08 мая 2011

Я не могу их сравнить, но оба это займет много времени.Я думаю, grep будет быстрее.

Но MySQL поддерживает полнотекстовое индексирование и поиск , что будет быстрее, чем grep - я думаю, снова.

Также я не понял, в чем проблемасо сфинксом или люценом.В любом случае, вот эталонный тест для MySQL, Sphinx и Lucene

0 голосов
/ 07 февраля 2013

Если вам нужен полнотекстовый индекс для кода, я бы порекомендовал инструменты для поиска кода Русс Кокса https://code.google.com/p/codesearch/

Вот как работал поиск кода Google http://swtch.com/~rsc/regexp/regexp4.html

0 голосов
/ 08 мая 2011

В интернете кажется, что grep использует Бойера-Мура, что сделает время запроса зависимым (а не мультипликативным) от размера запроса. Это не так важно, хотя.

Я думаю, что это почти оптимально для одноразового поиска. Но в вашем случае вы можете добиться большего успеха, так как у вас есть повторные поиски, которые вы можете использовать структуру (например, путем индексации некоторых общих подстрок в вашем запросе), как подсказывает bpgergo.

Кроме того, я не уверен, что движок регулярных выражений, о котором вы думаете, оптимизирован для нестандартного запроса, вы можете попробовать и посмотреть.

Возможно, вы захотите сохранить все файлы, которые вы просматриваете, в памяти, чтобы избежать замедления на основе жесткого диска. Это должно работать, если вы не ищете поразительное количество текста.

...