Когда следует использовать полнотекстовое индексирование? - PullRequest
49 голосов
/ 12 сентября 2008

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

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

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

Ответы [ 4 ]

31 голосов
/ 12 сентября 2008

Это будет зависеть от вашей СУБД. Я считаю, что большинство систем не воспользуются полнотекстовым индексом, если вы не используете полнотекстовые функции. (например, MATCH / AGAINST в mySQL или FREETEXT / CONTAINS в MS SQL)

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

20 голосов
/ 12 сентября 2008

FTS может помочь в этом сценарии, вопрос в том, стоит оно того или нет.

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

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

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

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

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

6 голосов
/ 28 июня 2013

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

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

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

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

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

3 голосов
/ 12 сентября 2008

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

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

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

    где fname как 'префикс%'

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

...