SQL Server: обычный индекс и полнотекстовый индекс

в чем именно разница (и преимущества/недостатки) между полнотекстовым индексом и обычным индексом по столбцу varchar? Когда я буду использовать какой индекс?

У меня есть множество столбцов varchar (адреса - название города, название улицы и т. д.), которые мне нужны для наиболее эффективного поиска, и я пытаюсь выяснить, какой тип индекса использовать и почему.

Спасибо!


person Alex    schedule 23.07.2009    source источник


Ответы (3)


Это зависит от того, какой поиск вы хотите выполнить. Например, вы не можете использовать обычный индекс с этим запросом:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE '%' + @SearchText + '%'

Это не sargable. Это можно проверить, но селективность может быть не очень хорошей:

SELECT * FROM [MyTable] WHERE [MyColumn] LIKE @SearchText + '%'

Вы используете полнотекстовый индекс совершенно по-другому:

SELECT * FROM [MyTable] WHERE CONTAINS([MyColumn], @SearchText)
person Joel Coehoorn    schedule 23.07.2009
comment
Есть ли тогда причина не использовать полнотекстовый индекс? - person Alex; 23.07.2009
comment
Они занимают много места на диске и медленно пересчитываются. - person Joel Coehoorn; 23.07.2009
comment
Серьезное упоминание потрясающее - я чувствую, что этому недостаточно учат. - person AndrewPK; 17.10.2012

Обычно при поиске по обычному индексу вы можете искать только в одном поле, например. "найти все города, которые начинаются с буквы А" или что-то в этом роде.

Полнотекстовый индекс позволяет выполнять поиск по нескольким столбцам, например. поиск сразу по улице, городу, провинции и т. д. Это может быть преимуществом, если вы хотите сделать что-то вроде поиска в стиле Google — просто введите поисковый запрос и найдите все строки, содержащие этот поисковый запрос, в любой из столбцы varchar.

Кроме того, при обычном поиске вы довольно ограничены в своих возможностях — вы можете искать точное совпадение или просто НРАВИТСЯ — вот и все.

С помощью полнотекстового индекса вы можете искать словоформы (run, run и т. д.), а также похожие слова, указав свой собственный тезаурус. Вы можете искать на нескольких языках, если это проблема. Вы можете искать записи, в которых есть два или более термина, которые находятся "РЯДОМ" друг с другом.

Марк

person marc_s    schedule 23.07.2009
comment
+1 за упоминание практических причин для создания индекса FULLTEXT, а не просто за комментарии по синтаксису и совместимым операциям. - person dayuloli; 21.10.2014

Из MSDN:

В отличие от полнотекстового поиска предикат LIKE Transact-SQL работает только с шаблонами символов. Кроме того, вы не можете использовать предикат LIKE для запроса форматированных двоичных данных. Кроме того, запрос LIKE к большому количеству неструктурированных текстовых данных выполняется намного медленнее, чем эквивалентный полнотекстовый запрос к тем же данным.

Возврат запроса LIKE к миллионам строк текстовых данных может занять несколько минут; тогда как полнотекстовый запрос может занять всего несколько секунд или меньше для тех же данных, в зависимости от количества возвращаемых строк.

person user142360    schedule 23.07.2009