У меня есть английский словарь в базе данных MySQL с чуть более 250 тыс. записей, и я использую простой интерфейс ruby для его поиска с использованием подстановочных знаков в начале строк. До сих пор я делал это так:
SELECT * FROM words WHERE word LIKE '_e__o'
или даже
SELECT * FROM words WHERE word LIKE '____s'
Я всегда знаю точную длину слова, но все, кроме одного символа, потенциально неизвестны.
Это медленнее, чем меласса, примерно в пятнадцать раз медленнее, чем аналогичный запрос без главного шаблона, потому что индекс для столбца не может быть использован.
Я пробовал несколько методов, чтобы сузить область поиска. Например, я добавил 26 дополнительных столбцов, содержащих каждое число слов с индивидуальными буквами, и сузил поиск с помощью первых. Я также пытался сужаться по длине слова. Эти методы практически не отличались, благодаря присущей неэффективности поиска подстановочных знаков. Я экспериментировал с оператором REGEXP, который еще медленнее.
SQLite и PostgreSQL так же ограничены, как и MySQL, и хотя у меня ограниченный опыт работы с системами NoSQL, мои исследования создают у меня впечатление, что они превосходят масштабируемость, а не производительность, которая мне нужна.
Мой вопрос тогда, где я должен искать решение? Должен ли я продолжать поиск способа оптимизации моих запросов или добавления дополнительных столбцов, которые могут сузить мой потенциальный набор записей? Существуют ли системы, специально предназначенные для быстрого поиска подстановочных знаков в этом ключе?