我有一个用PHP编写的PHP论坛,我想提供论坛搜索。它将允许用户搜索特定字符串,以及过滤元数据,如发布日期和主题等。可以有效地搜索元数据,因为大多数这些字段都被编入索引,但我认为主要用例当然是普通的文本搜索,而不使用可能会削减结果的元数据过滤器。
经过一些测试后我发现,与大多数人的设置相反,SQL_CALC_FOUND_ROWS明显快于(大约1.5倍)比执行查询两次以获得结果数量,所以我有最好的查询是:
SQL_CALC_FOUND_ROWS * from blahblah where content like '%term%' limit whatever whatever;
不出所料,这非常慢,因为它必须对数据库中的每个论坛帖子进行文本匹配。有什么我可以做的改进吗?在使用LIKE
运算符时,在内容(TEXT)字段上放置索引会有帮助吗?通常如何做到这一点?
答案 0 :(得分:5)
即使使用like运算符,列上的索引也会有所帮助,但是当你在开头也有通配符时也是如此。因此,对于term%
,索引将是有益的,但对于%term%
,它不会。
但相反,您可以查看FULLTEXT
索引。如果将这样的索引添加到TEXT字段,MySQL会对单词进行索引,并允许您进行各种类似搜索引擎的搜索。要搜索您,请使用MATCH() ... AGAINST
代替LIKE
。
查看文档: https://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
免责声明:我建议您在第一次实验后仔细阅读文档。 FULLTEXT索引功能强大,但仍有其局限性。
FULLTEXT索引占用了相当大的空间,它们的构建方式取决于MySQL中的核心设置,因此它们在本地设置和服务器之间的行为可能不同。
例如,他们索引完整的单词,但遗漏了非常短的单词和某些单词。此外,因为他们索引单词,您将无法搜索部分单词。寻找'期限'将无法找到开箱即用的'确定'。
因此,请确保这些索引可以执行您想要的操作,如果您有共享主机,请确保在执行大型实施之前可以按照您喜欢的方式对其进行配置和调整。