我什么时候应该使用FULLTEXT索引?

时间:2016-06-15 15:16:29

标签: mysql sql

我有一张这样的表:

// 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:我想同时选择tagBtagD,所以这是预期的输出:

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

1 个答案:

答案 0 :(得分:0)

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

这不会在列上使用索引,因为您的术语以通配符开头。

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

Bette这样做:

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

由于builddup的全文索引删除了特殊的字符和停用词。

同样在使用全文索引时,需要考虑最小字长,尽管您可以配置一些选项http://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html

回答这个问题,哪一个更好:我肯定会尝试全文索引,因为在使用通配符开始搜索时无法使用常规索引。

保存数据的更好方法是规范化表格,因此将标记放在另一个表格中,每个表格都在自己的字段中。