В MySQL, если таблица фильмов имеет поле описания, как выполнить поиск по этому описанию? - PullRequest
1 голос
/ 25 мая 2010

Скажем, используя MySQL, если таблица movies содержит 20 000 записей, и каждая запись имеет поле, которое является описанием фильма, длиной до 2 Кбайт. Как мы можем искать фильмы со словом «природа» в его описании? Если возможно, это должно быть быстро, вместо того, чтобы просматривать все 20 000 записей. (если в некоторых других ситуациях, например, для книг, где n может составлять 200 000 или более).

Ответы [ 2 ]

4 голосов
/ 25 мая 2010

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

Что бы я сделал - это вставил, обновил и удалил триггеры на столе. Для триггеров вставки / обновления я бы заполнил другую таблицу в соответствии с 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%';

из воды.

2 голосов
/ 25 мая 2010

В этом случае вы хотите использовать индекс полнотекстового поиска.Имейте в виду, что есть некоторые ловушки, такие как минимальное слово, длина, стоп-слова и т. Д.

Синтаксис для FTS выглядит следующим образом:

WHERE MATCH (field) AGAINST ('text');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...