我有一个包含75,000多行的数据库,每天添加500多个条目.
每行都有标题和说明.
我创建了一个RSS源,它为您提供特定搜索词的最新条目(例如http://site.com/rss.rss?q=Pizza将输出搜索词"Pizza"的RSS).
我想知道为此编写SQL查询的最佳方法是什么.现在我有:
SELECT *
FROM 'table'
WHERE (('title' LIKE %searcherm%) OR ('description' LIKE %searcherm%))
LIMIT 20;
Run Code Online (Sandbox Code Playgroud)
但问题是执行查询需要2到10秒.
有没有更好的方法来编写查询,我是否必须缓存结果(我将如何做?)或者更改数据库结构中的某些内容会加快查询速度(索引?)
一个相对简单的解决方案是在这两个字段中加入FULLTEXT索引,然后使用该索引进行搜索.
ALTER TABLE table ADD FULLTEXT(title, description);
Run Code Online (Sandbox Code Playgroud)
然后你需要进行搜索,你会做以下事情:
SELECT id FROM table
WHERE MATCH (title, description) AGAINST ('keyterm');
Run Code Online (Sandbox Code Playgroud)
全文索引搜索是大多数SQL数据库中包含的自动解决方案.与做LIKES相比,它更快.这也针对您的具体情况进行了优化,因为您只对自然语言搜索术语感兴趣.
同样,全文索引具有一些用于检测相关性的限制算法.你可以在这里阅读更多相关信息
编辑
在alter语句中,我错过了全文索引名称,它应该是:
ALTER TABLE table ADD FULLTEXT ft_index_name(title, description);
Run Code Online (Sandbox Code Playgroud)
尝试:
SELECT * FROM table
WHERE MATCH (title,description) AGAINST (searchterm);
Run Code Online (Sandbox Code Playgroud)
确保在标题和描述上添加全文索引。
不要试图重新发明轮子。MATCH而AGAINST在由MySQL提供的恰恰如此,使您的生活更轻松。但是,请注意全文搜索适用于 MyISAM 表。您也可以解决InnoDb 的问题。您可以通过更改表来简单地添加 FT 索引,例如:
ALTER TABLE table ADD FULLTEXT(title,description);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8089 次 |
| 最近记录: |