目前我在生产中有一个监视器应用程序。这个监视器的工作是收集Facebook、Twitter、YouTube等社交网络上的特定条目。
以下是来自Twitter的API调用的一个简单示例:
http://search.twitter.com/search?q=Stackoverflow&format=json
基本上,系统就是这样做的:
从给定特定顺序的数据库中选择搜索词
调用api
从当前搜索中收集所有tweets状态id和用户id
检查数据库是否存在
运行tweets插入,消除现有tweets和用户,并防止重复输入错误。
我们完成了两张桌子,一张给用户,另一张给推特。
问题
在mysql数据库达到tweets表上的200.000个条目之后(在头几个月),可视化数据的应用程序在对现有tweets执行select查询时开始消耗太多资源。
为什么?
系统有独立的账户,每个账户都有与其特定业务相关的特定搜索词。当我们执行选择时,我们只需要选择与我们的帐户条款相关联的选项。我们看不到与我们无关的tweets。
但是一条推特可以出现在很多账户上。
真正的疑问(伤了我的眼睛)

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 ()进行全文搜索。
主要问题
这是否足以减少cpu和ram之类的资源消耗?
有什么我能做得更好的吗?

最佳答案

免责声明:这是我对这个问题的评论之一,可能是答案:
我认为match ... against在这里是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我会使用Sphinx-它自己索引数据库(有自己的机制),并且执行搜索的速度比mysql快

关于php - 简单但繁重的应用程序消耗大量资源。如何优化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6785287/

10-11 01:45
查看更多