简单但繁重的应用程序消耗大量资源。如何优化?

时间:2011-07-22 03:19:32

标签: php mysql sql performance database-design

目前我在生产中有一个监视器应用程序。此监视器的工作是收集社交网络上的特定条目,如facebook,twitter,youtube等。

以下是来自Twitter的API调用的一个简单示例:

http://search.twitter.com/search?q=Stackoverflow&format=json

基本上,这就是系统的作用:

  1. 根据特定订单从数据库中选择搜索词
  2. 调用API
  3. 从当前搜索中收集所有推文状态ID和用户ID
  4. 检查数据库是否存在
  5. 运行推文插入,消除现有推文和用户,防止重复输入错误。
  6. 我们完成了两个表,一个用于用户,另一个用于推文。

    问题

    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等资源消耗吗? 我能做些什么更好的事情吗?

1 个答案:

答案 0 :(得分:4)

免责声明 :这是我对这个问题的评论之一,可能就是答案:


我认为match ... against在这里是合适的。这就是所谓的“全文搜索”。对于更复杂的搜索,我使用Sphinx - 它自己索引数据库(拥有自己的机制)并以比MySQL快的速度执行搜索