BadThings, вот что могу вам предложить:
- Разбивайте ваши строки на отдельные "слова"-претенденты для поиска. Слова ищите по отдельности в таблице.
- Номера в таблице "нормализуйте" (не в реляционном смысле, а в смысле uppercase, удаление неоднозначных разделителей).
- Таблицу проиндексируйте.
- Сформулируйте стоп-критерии для слов, например по длине, наличию каких-то нехарактерных для номера символов. Для этого можно посчитать статистику по БД (min, max, set of char и т.д.).
- Морфируйте искомые слова, например, в слове "123-0X" не ясно цифра "ноль" или буква "O" какого-то алфавита, "Икс" или кириллическая буква "Хер". Придётся строить сочетания неоднозначностей и искать их все. Но это не проблема.
- Заведите в памяти кэш, ограниченный размером. В кэше нужно держать только слова с максимальными частотами поиска по базе. Этот кэш можно сделать персистентным и загружать в память перед поиском. Основной расчет на то, что кэшироваться будут часто встречающиеся слова, которых нет в БД.
Таким образом из строки
Накопитель SSD Samsung SATA III 500Gb MZ-76E500BW 860 EVO 2.5"
"SSD", "SATA", "III", "500GB", "860", "EVO", "2.5" - не пройдут в поиск по ограничению минимальной длинны;
"Накопитель", "Samsung" - попадут в кэш с информацией о том, что их нет в БД.
Остальные слова, которых уже будет не так много, будут морфироваться и с логарифмической сложностью искаться в БД.
Думаю всё будет работать просто мгновенно. В любом случае локальным персистентным кэшем несуществующих в БД слов можно закидать любые тормоза в контексте вашей задачи.