我有一张这样的表:
// 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 :(得分: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
回答这个问题,哪一个更好:我肯定会尝试全文索引,因为在使用通配符开始搜索时无法使用常规索引。
保存数据的更好方法是规范化表格,因此将标记放在另一个表格中,每个表格都在自己的字段中。