目前我在生产中有一个监视器应用程序。这个监视器的工作是收集社交网络上的特定条目,如 facebook、twitter、youtube 等。
这是一个来自 Twitter 的 API 调用的简单示例:
http://search.twitter.com/search?q=Stackoverflow&format=json
基本上,这是系统所做的:
- 根据特定顺序从数据库中选择搜索词
- 调用API
- 从当前搜索中收集所有推文状态 ID 和用户 ID
- 检查数据库是否存在
- 运行推文插入以消除现有推文和用户并防止重复输入错误。
我们完成了两个表,一个用于用户,另一个用于推文。
问题
当 MySql 数据库在 tweets 表上达到 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 等资源消耗吗? 我能做些什么更好的事情吗?
最佳答案
免责声明:这是我对这个问题的评论之一,可能是答案:
我认为match ... against
在这里是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我会使用 Sphinx
- 它自己为您的数据库编制索引(有自己的机制)并比 MySQL 更快地执行搜索
关于php - 简单但繁重的应用程序消耗大量资源。如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6785287/