Jeśli masz 1M plików do przeszukania, (najlepiej, jeśli jestem tego świadomy) przejdziesz przez każdy z nich za pomocą wyrażenia regularnego.
Dla wszystkich zamierzeń i celów, zrobisz to samo dla wierszy tabeli, jeśli wyślesz je masowo za pomocą operatora LIKE lub wyrażenia regularnego.
Moje własne doświadczenie z grepem jest takie, że rzadko szukam czegoś, co nie zawiera przynajmniej jednego pełnego słowa, więc możesz skorzystać z bazy danych, aby zmniejszyć zestaw, w którym szukasz.
MySQL ma natywne funkcje wyszukiwania pełnotekstowego, ale odradzałbym je, ponieważ oznaczają, że nie używasz InnoDB.
Możesz przeczytać o tych z Postgres tutaj:
http://www.postgresql.org/docs/current/static/textsearch .html
Po utworzeniu indeksu w kolumnie tsvector, możesz wykonać swój "grep" w dwóch krokach, jeden, aby natychmiast znaleźć wiersze, które mogą się niejasno kwalifikować, a następnie drugi według twoich prawdziwych kryteriów:
select * from docs where tsvcol @@ :tsquery and (regexp at will);
Będzie to znacznie szybsze niż cokolwiek, co może zrobić grep.