Я бы не стал обрабатывать столбец описания напрямую - функции для отдельных строк редко масштабируются хорошо. Одно из правил, на которое я подписываюсь, - никогда не обрабатывать вещи внутри столбцов (например, описания в вашем случае, или части столбцов с переменными, разделенными запятыми, или даже имена (первый / последний) и адрес (улица / город / штат) компоненты). Если вы делаете это, обычно есть более эффективный способ.
Что бы я сделал - это вставил, обновил и удалил триггеры на столе. Для триггеров вставки / обновления я бы заполнил другую таблицу в соответствии с DescLookup
ниже:
Movies:
Id primary key
Title
Description
DescLookup:
Word
MovieId foreign key Movies(Id)
Count
primary key (Word,MovieId)
index (MovieId)
По сути, для каждого нешумного слова в описании (то есть, скидка на такие вещи, как and
, or
, by
, пунктуация, однобуквенные слова и т. Д.), Вы получаете запись в этой таблице (со словом в нижнем регистре).
Перед повторным заполнением убедитесь, что триггер удаляет все текущие строки для этого MovieId
, чтобы не остаться с неверной информацией.
Затем вы используете эту таблицу для выполнения ваших запросов. Это перемещает «стоимость» поиска слов для вставки / обновления, а не для каждого отдельного выбора, что значительно снижает стоимость. Это хорошо работает, потому что обширное большинство баз данных читается гораздо чаще, чем записывается, поэтому перенос стоимости на часть записи - хорошая идея.
Имейте в виду, что для этого требуется дополнительное место для хранения, но, если вы изучите большое количество вопросов, которые люди задают о базах данных, "Как я могу сделать это быстро?" намного превосходит "Как я могу использовать меньше дискового пространства?".
И триггер удаления просто удалит все записи в таблице DescLookup
с соответствующими MovieId
.
Поскольку столбец Word
проиндексирован (а также, как вы и просили, вы не будете искать каждое поле описания), поиск по нему будет ослепительно быстрым. Это потому что:
select MovieId from DescLookup where Word = 'nature';
будет дуть:
select Id from Movies where lower(Description) like '%nature%';
из воды.