Когда следует использовать полнотекстовое индексирование?

StackOverflow https://stackoverflow.com/questions/57918

Вопрос

У нас есть целая куча запросов, которые «ищут» клиентов, заказчиков и т.д.Вы можете искать по имени, электронной почте и т. д.Мы используем операторы LIKE следующим образом:

SELECT * 
FROM customer 
WHERE fname LIKE '%someName%'

Поможет ли в этом сценарии полнотекстовая индексация?Мы используем SQL Server 2005.

Это было полезно?

Решение

Это будет зависеть от вашей СУБД.Я считаю, что большинство систем не смогут воспользоваться преимуществами полнотекстового индекса, если вы не используете полнотекстовые функции.(например. МАТЧ/ПРОТИВ в MySQL или FREETEXT/CONTAINS в MS SQL)

Вот хорошая статья о том, когда, почему и как использовать полнотекстовое индексирование в SQL Server: Общие сведения о полнотекстовом индексировании SQL Server

Другие советы

ФНС может помогите в таком случае, вопрос стоит оно того или нет.

Для начала давайте разберемся, почему LIKE возможно, это не самый эффективный поиск.Когда вы используете LIKE, особенно при поиске с помощью % в начале сравнения SQL Server необходимо выполнить сканирование таблицы каждой отдельной строки и побайтовая проверка проверяемого столбца.

У FTS есть несколько лучших алгоритмов для сопоставления данных, а также лучшая статистика по вариантам имен.Таким образом, FTS может обеспечить лучшую производительность при сопоставлении Смита, Смайта, Смитерса и т. д., когда вы ищете Смита.

Однако использовать FTS немного сложнее, так как вам необходимо освоить CONTAINS против FREETEXT и загадочный формат поиска.Однако если вы хотите выполнить поиск по совпадению FName или LName, вы можете сделать это с помощью одного оператора вместо OR.

Чтобы определить, будет ли FTS эффективной, определите, сколько данных у вас есть.Я использую FTS для базы данных, состоящей из нескольких сотен миллионов строк, и это реальное преимущество перед поиском с помощью LIKE, но я не использую его на каждом столе.

Если размер вашей таблицы более разумен, менее нескольких миллионов, вы можете получить аналогичную скорость, создав индекс для каждого столбца, по которому вы собираетесь искать, и SQL Server должен выполнять сканирование индекса, а не сканирование таблицы.

Согласно моему тестовому сценарию:

  • SQL-сервер 2008
  • 10.000.000 рядов с помощью строки, подобной «Worda wordb wordc ...» (варьируется от 1 до 30 слов)
  • выбор счетчика (*) с помощью CONTAINS (столбец, «wordB»)
  • размер результата несколько сотен тысяч
  • размер каталога около 1,8 ГБ

Полнотекстовый индекс находился в диапазоне 2 с, тогда как например '% wordB %' находился в пределах 1-2 минут.

Но это имеет значение только в том случае, если вы не используете никаких дополнительных критериев выбора! Например.если бы я использовал немного "как 'префикс%'" Кроме того, в столбце первичного ключа производительность была хуже, поскольку операция перехода в полнотекстовый индекс стоит дороже, чем строковый поиск в некоторых полях (если они не слишком велики).

Поэтому я бы рекомендовал полнотекстовый индекс только в тех случаях, когда вам нужно выполнить «бесплатный поиск строк» ​​или использовать некоторые его специальные функции...

Чтобы ответить на вопрос конкретно для MSSQL, полнотекстовое индексирование будет НЕТ помогите в вашем сценарии.

Чтобы улучшить этот запрос, вы можете сделать одно из следующих действий:

  1. Настройте полнотекстовый каталог для столбца и используйте функцию CONTAINS().
  2. Если вы в первую очередь искали по префиксу (т.совпадение с начала имени), вы можете изменить предикат на следующий и создать индекс по столбцу.

    где fname типа «префикс%»

(1), вероятно, является излишним для этого, если только производительность запроса не является большой проблемой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top