我有一个使用MySQL用PHP编写的论坛,并且希望提供论坛搜索。它将允许用户搜索特定的字符串,并过滤发布日期和主题等元数据。因为大多数这些字段都已编入索引,所以可以有效地搜索元数据,但是我认为主要的用例当然是普通的文本搜索,而无需使用会修剪结果的元数据过滤器。
经过一些测试,我发现,与大多数人的设置相反,SQL_CALC_FOUND_ROWS为了获得结果数量,比两次执行查询要快得多(约1.5倍),因此,我拥有的最佳查询是:
SQL_CALC_FOUND_ROWS * from blahblah where content like '%term%' limit whatever whatever;
毫不奇怪,这确实很慢,因为它必须对数据库中的每个论坛帖子进行文本匹配。我有什么可以改善的吗?使用LIKE
运算符时,在内容(TEXT)字段上添加索引是否有帮助?通常如何做到这一点?
即使使用like运算符,该列上的索引也将有所帮助,但当开头也有通配符时,该索引将无济于事。因此,term%
对于索引而言将是有益的,但%term%
对它而言则无济于事。
但是,您可以看看FULLTEXT
索引。如果将这样的索引添加到TEXT字段中,则MySQL会对单独的单词进行索引,并允许您进行各种类似于搜索引擎的搜索。要搜索,请使用MATCH() ... AGAINST
代替LIKE
。
参见文档:https : //dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
免责声明:我建议您在第一次实验后仔细阅读文档。FULLTEXT索引功能强大,但仍有其局限性。
FULLTEXT索引占用相当大的空间,并且它们的构建方式取决于MySQL中的核心设置,因此它们在本地设置和服务器之间的行为可能有所不同。
例如,它们索引完整的单词,但忽略非常短的单词和某些停用词。另外,由于它们索引单词,因此您将无法搜索单词的一部分。寻找'term'不会找到开箱即用的'determine'。
因此,请确保这些索引可以执行您想要的操作,并且如果您拥有共享的托管服务,请确保在进行大型实现之前可以按照自己喜欢的方式对其进行配置和调整。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句