目前我在生产中有一个监视器应用程序。这个监视器的工作是收集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/