2016-06-15 3 views
1

У меня есть таблица вроде этого:Когда следует использовать индекс FULLTEXT?

// qanda 
+----+---------+-----------------------+------------------------+ 
| id | title |  content  |   tags   | 
+----+---------+-----------------------+------------------------+ 
| 1 | title1 | content1    | <a>tagA<a/><a>tagB</a> | 
| 2 | title2 | content2    | <a>tagA</a><a>tagC</a> | 
| 3 | title3 | content3    | <a>tagM</a><a>tagB</a> | 
| 4 | title4 | content4    | <a>tagD</a>   | 
| 5 | title5 | content5    | <a>tagA</a><a>tagG</a> | 
+----+---------+-----------------------+------------------------+ 

Теперь я пытаюсь искать в tags колонки. Поэтому я хочу получить этот результат:

+----+---------+-----------------------+------------------------+ 
| 1 | title1 | content1    | <a>tagA<a/><a>tagB</a> | 
| 3 | title3 | content3    | <a>tagM</a><a>tagB</a> | 
+----+---------+-----------------------+------------------------+ 

Хорошо, а какой лучше?

. . . WHERE tags LIKE '%>tagB<%'    -- regular index 

. . . WHERE MATCH (tags) AGAINST ('>tagB<') -- fulltext index 

Примечание: Иногда мне нужно найти несколько тегов. EX: Я хочу, чтобы выбрать оба tagB и tagD, так это, как ожидается выход:

+----+---------+-----------------------+------------------------+ 
| 1 | title1 | content1    | <a>tagA<a/><a>tagB</a> | 
| 3 | title3 | content3    | <a>tagM</a><a>tagB</a> | 
| 4 | title4 | content4    | <a>tagD</a>   | 
+----+---------+-----------------------+------------------------+ 

ответ

0
. . . WHERE tags LIKE '%>tagB<%'    -- regular index 

Это не будет использовать индекс, установленный на колонку, потому что ваш срок начинается с шаблоном.

. . . WHERE MATCH (tags) AGAINST ('>tagB<') -- fulltext index 

Бетта, чтобы сделать это следующим образом:

. . . WHERE MATCH (tags) AGAINST ('tagB') -- fulltext index 

Как полнотекстовый индекс накопления удаляет специальные символы и стоп-слова.

Также при использовании полнотекстового индекса есть минимальная длина слова, чтобы рассмотреть, хотя есть некоторые опции, которые можно настроить http://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html

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

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

Смежные вопросы