在SQL中搜索最有效的方法?

sup*_*lle 8 mysql sql

我有一个包含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秒.

有没有更好的方法来编写查询,我是否必须缓存结果(我将如何做?)或者更改数据库结构中的某些内容会加快查询速度(索引?)

gtr*_*32x 9

一个相对简单的解决方案是在这两个字段中加入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)

  • 非常感谢!!!我对此进行了测试,平均搜索速度提高了14倍! (2认同)
  • @FrancisAvila 自 MySQL 5.6 起,InnoDB 支持全文搜索。 (2认同)

jer*_*use 5

尝试:

SELECT * FROM table
WHERE MATCH (title,description) AGAINST (searchterm);
Run Code Online (Sandbox Code Playgroud)

确保在标题和描述上添加全文索引。

不要试图重新发明轮子。MATCHAGAINST由MySQL提供的恰恰如此,使您的生活更轻松。但是,请注意全文搜索适用于 MyISAM 表。您也可以解决InnoDb 的问题。您可以通过更改表来简单地添加 FT 索引,例如:

ALTER TABLE table ADD FULLTEXT(title,description);
Run Code Online (Sandbox Code Playgroud)