目前,我在生产中有一个监视器应用程序。该监视器的工作是收集社交网络上的特定条目,如Facebook,Twitter,YouTube等。
这是一个来自Twitter的API调用的简单示例:
http://search.twitter.com/search?q=Stackoverflow&format=json
基本上,这就是系统的作用:
我们完成了两个表,一个表用于用户,另一个表用于tweet。
问题
在MySql数据库达到tweets表上的200.000条目之后(在最初的几个月中),可视化该数据的应用程序在对现有tweet执行选择查询时开始消耗太多资源。
为什么?
该系统具有独立的帐户,每个帐户都有与其特定业务相关的某些搜索词。执行选择时,我们只需要选择与我们的帐户条款相关联的内容。我们看不到与我们无关的推文。但是一条推文可能涉及多个帐户。
实际查询(伤了我的眼睛)
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。这样tweets表上的每个tweet都可以与一个特定的搜索词相关。
因此,我们将搜索这些表,而不是搜索特定的字符串。
b)继续搜索,但是使用进行全文搜索MATCH () AGAISNT ()。
MATCH () AGAISNT ()
主要问题
这足以减少CPU和RAM等资源消耗吗?有什么我可以做的更好的吗?
免责声明 :这是我对此问题的评论之一,可能是答案:
我认为这match ... against是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我会使用Sphinx-它自己对数据库建立索引(具有自己的机制),并且执行查询的速度比MySQL快
match ... against
Sphinx