目前我在生产中有一个监视器应用程序。此监视器的工作是收集社交网络上的特定条目,如facebook,twitter,youtube等。
以下是来自Twitter的API调用的一个简单示例:
http://search.twitter.com/search?q=Stackoverflow&format=json
基本上,这就是系统的作用:
我们完成了两个表,一个用于用户,另一个用于推文。
问题
MySql数据库在推文表上达到200.000个条目(在头几个月),在现有推文上执行选择查询时,可视化该数据的应用程序开始消耗太多资源。
为什么吗
系统已分离帐户,每个帐户都有与其特定业务相关的特定搜索字词。当我们执行选择时,我们只需要选择与我们帐户的条款相关联的那些。我们看不到与我们无关的推文。 但有一条推文可以出现在许多账户上。
实际查询(伤害我的眼睛)
SELECT *
FROM tweets
WHERE
content LIKE '%searchterm1%'
OR LIKE '%searchterm2%'
OR LIKE '%searchterm3%'
OR LIKE '%searchterm4%'
OR LIKE '%searchterm5%'
OR LIKE '%searchterm6%'
OR LIKE '%searchterm7%'
OR LIKE '%searchterm8%'
(and son on...)
两种可能的解决方案
a)创建一个tweets_searches表,该表有两个外键:tweet_id和search_id。因此,推文表上的每条推文都可以与一个特定的搜索词相关联。
因此,我们不会搜索特定的字符串,而是会加入这些表格。
b)继续搜索,但使用MATCH () AGAISNT ()
进行全文搜索。
主要问题
这足以减少CPU和RAM等资源消耗吗? 我能做些什么更好的事情吗?
答案 0 :(得分:4)
免责声明 :这是我对这个问题的评论之一,可能就是答案:
我认为match ... against
在这里是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我使用Sphinx
- 它自己索引数据库(拥有自己的机制)并以比MySQL快的速度执行搜索