我有一张这样的表:
// posts
+----+-------------+-----------------------------+
| id | title | body |
+----+-------------+-----------------------------+
| 1 | First Post | The content of first post |
| 2 | Second Post | The content of second post |
+----+-------------+-----------------------------+
现在我需要搜索title
和body
列。注意到我想要搜索这两列作为全文。
我的问题:我是否需要在这两列上分别制作一个复合索引或分别在它们上制作两个单个索引?
换句话说,哪一个?
tb(title,body)
|查询:WHERE MATCH(title,body) AGAINST(?,?)
t(title), b(body)
|查询:WHERE MATCH(title) AGAINST(?) OR MATCH(body) AGAINST(?)
老实说,我无法理解这些的不同^。
同样是的,我知道,我的问题标题与内容不符。
答案 0 :(得分:1)
首先,将通过主键或唯一键列自动创建索引。因此,我建议根据您的选择性制作主键。
第二件事是索引字符串值比读取和写入操作的整数值慢得多。不幸的是,您所需的两列都是字符串。
现在,如果您使用tb(title,body)
这样的复合索引,那么在您调整WHERE MATCH(title)
而不是WHERE MATCH(body)
时,您将获益。
我建议使用两个不同于复合索引的索引,但这会导致写入速度变慢。但是根据基本原则,我总是建议尽量减少索引宽度,因为它减少了索引的大小和读取索引所需的磁盘I / O读取次数。
使用两个不同的索引,单个索引将根据您使用的列的条件而起作用。
答案 1 :(得分:1)
你的两个索引选项会给你(除了极少数涉及myisam表的情况)相同的行,但有一些细微的差别:
order by (MATCH(title) AGAINST(?) + MATCH(body) AGAINST(?))
。这会使您的查询减慢一些。 order by (MATCH(title) AGAINST(?) + MATCH(body) AGAINST(?))
将产生与order by MATCH(title, body) AGAINST(?,?)
略有不同的顺序(其中是自然模式下的默认顺序)。但要再次强调,你将得到相同的行,只是略有不同的顺序。order by (MATCH(title) AGAINST(?) + MATCH(body) AGAINST(?) * 0.5)
使主题中的结果比正文中的结果更重要所以,总结一下: