Когда вы должны использовать полнотекстовую индексацию?
У нас есть целая куча запросов, которые "ищут" для клиентов, клиентов и т.д. Вы можете искать по имени, электронной почте и т.д. Мы используем инструкции LIKE следующим образом:
SELECT *
FROM customer
WHERE fname LIKE '%someName%'
Помогает ли полнотекстовая индексация в сценарии? Мы используем SQL Server 2005.
Ответы
Ответ 1
Это будет зависеть от вашей СУБД. Я считаю, что большинство систем не будут использовать полнотекстовый индекс, если вы не используете полнотекстовые функции. (например, MATCH/AGAINST в mySQL или FREETEXT/CONTAINS в MS SQL)
Вот хорошая статья о том, когда, почему и как использовать полнотекстовую индексацию в SQL Server: Общие сведения о полнотекстовом индексировании SQL Server
Ответ 2
FTS может помочь в этом сценарии, вопрос в том, стоит ли это или нет.
Для начала рассмотрим, почему LIKE
может быть не самым эффективным поиском. Когда вы используете LIKE
, особенно когда вы начинаете поиск с %
в начале вашего сравнения, SQL Server должен выполнять как проверку таблицы каждой строки, так и байтовую проверку столбца, которую вы проверяете.
У FTS есть несколько лучших алгоритмов для сопоставления данных, так же как и некоторые лучшие статистические данные об изменениях имен. Поэтому FTS может обеспечить лучшую производительность для соответствия Smith, Smythe, Smithers и т.д., Когда вы ищете Smith.
Однако использование FTS немного сложнее, так как вам нужно овладеть CONTAINS
vs FREETEXT
и тайным форматом поиска. Однако, если вы хотите выполнить поиск, где совпадают имена FName или LName, вы можете сделать это с помощью одного оператора вместо OR.
Чтобы определить, будет ли FTS эффективнее, определите, сколько у вас данных. Я использую FTS в базе данных из нескольких сотен миллионов строк и получаю реальную выгоду от поиска с помощью LIKE
, но я не использую его для каждой таблицы.
Если размер вашей таблицы более разумный, менее нескольких миллионов, вы можете получить схожую скорость, создав индекс для каждого столбца, который вы собираетесь искать, и SQL Server должен выполнить сканирование индекса, а не таблицу сканирования.
Ответ 3
Согласно моему сценарию тестирования:
- SQL Server 2008
- 10.000.000 строк каждая со строкой типа "wordA wordB
wordC... "(варьируется от 1 до 30 слов)
- выбор count (*) с CONTAINS (столбец, "wordB" )
- размер результата несколько сотен тысяч
- размер каталога около 1,8 ГБ
Полнотекстовый индекс находился в диапазоне от 2 секунд, тогда как "% wordB%" находился в диапазоне 1-2 минут.
Но это считается только в том случае, если вы не используете никаких дополнительных критериев выбора!. если бы я использовал некоторый "как" префикс% '"в столбце первичного ключа, производительность была хуже, так как операция перехода в полнотекстовый индекс стоила больше, чем выполнение строкового поиска в некоторых полях (пока это не слишком много).
Поэтому я бы рекомендовал полнотекстовый индекс только в тех случаях, когда вам нужно выполнить "поиск свободной строки" или использовать некоторые из его особенностей...
Ответ 4
Чтобы ответить на вопрос специально для MSSQL, полнотекстовое индексирование поможет НЕ в вашем сценарии.
Чтобы улучшить этот запрос, вы можете выполнить одно из следующих действий:
(1), вероятно, слишком велико для этого, если производительность запроса не является большой проблемой.