2012-06-14 127 views
0

我有一個測試頁面正在運行#-tag趨勢,它存儲在我的數據庫中。該頁面需要很長的時間顯示的內容之前,只用一個函數來加載(最多2分鐘)即頁面PHP/MYSQL排名代碼導致緩慢加載頁面PHP/MYSQL

網址:http://www.sudanesetweeps.com/trendingtopics.php

如何調整使頁面加載的聲明中少時間?

這是我的代碼:

<?php 

require_once("dbconnect.php"); 
require_once("lib_isarabic.php"); 

$query = "SELECT COUNT(*) cnt, hashtags 
FROM tweets 
WHERE tweeted_at >= DATE_SUB(NOW() , INTERVAL 2 DAY) 
AND hashtags != '' 
GROUP BY hashtags 
ORDER BY cnt DESC LIMIT 100"; 

$res = mysql_query($query); 

while($row = mysql_fetch_assoc($res)) { 

    $count = $row['cnt']; 
    $hashtags = explode(" ", $row['hashtags']); 

    foreach($hashtags as $hashtag) { 
     if(strtolower($hashtag) != 'sudan' && strtolower($hashtag) != 'new' && strtolower($hashtag) != 'new')  
      if(is_arabic($hashtag)) 
       $topics_ara[strtolower(trim($hashtag))] += $count;    
      else  
       $topics_eng[strtolower(trim($hashtag))] += $count;   

    } 
} 

array_multisort($topics_ara, SORT_DESC); 
array_multisort($topics_eng, SORT_DESC); 

$index = 0; 
foreach($topics_eng as $key=>$value) { 

    $query = "SELECT count(*) cnt FROM ( 
      SELECT count(*), tweeted_by FROM tweets 
      WHERE hashtags like '%$key%' 
         AND tweeted_at >= DATE_SUB(NOW() , INTERVAL 2 DAY) 
      GROUP BY tweeted_by 
      ) AS T"; 


/*    $query = " 
      SELECT count(*) FROM tweets 
      WHERE hashtags like '%$key%' 
         AND tweeted_at > DATE_SUB(NOW() , INTERVAL 1 DAY) "; 
*/ 

     $res = mysql_query($query);    
     $row = mysql_fetch_assoc($res); 

     if($row['cnt'] > 1) { 

     $index++; 
     if($key != "") { 
      $trending_eng[$key] = $value; 
     } 
    } 

    if($index > 30) 
     break; 
} 


$index = 0; 
foreach($topics_ara as $key=>$value) { 

    $query = "SELECT count(*) cnt FROM ( 
      SELECT count(*), tweeted_by FROM tweets 
      WHERE hashtags like '%$key%' 
         AND tweeted_at >= DATE_SUB(NOW() , INTERVAL 2 DAY) 
      GROUP BY tweeted_by 
      ) AS T"; 
     $res = mysql_query($query); 
     $row = mysql_fetch_assoc($res); 

     if($row['cnt'] > 1) { 

     $index++; 
     if($key != "") { 
      $trending_ara[$key] = $value; 
     } 
    } 

    if($index > 30) 
     break; 
} 


//var_dump($trending_eng) ; 
//var_dump($trending_ara) ; 

?> 
+2

請表的鳴叫,不要使用'mysql_ *'功能的新代碼。他們不再被維護,社區已經開始[棄用流程](http://goo.gl/KJveJ)。請參閱[**紅框**](http://goo.gl/GPmFd)?相反,您應該瞭解[準備好的語句](http://goo.gl/vn8zQ)並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能決定,[本文](http://goo.gl/3gqF9)將有助於選擇。如果你關心學習,[這裏是很好的PDO教程](http://goo.gl/vFWnC)。 –

+0

[Profile your code](http://stackoverflow.com/questions/133686/profiling-php-code/134305#134305),然後提出具體問題。 –

+0

@Truth - 感謝您發佈PDO教程;我在我的評論中也包含了使用'mysql_ *''的人。 –

回答

3

很抱歉,但你的數據模型是有缺陷的。

您不會標準化推文,而是對標籤進行全文搜索(通過hashtags like '%$key%'),這意味着時間間隔中所有推文的完整文本必須通過CPU密集型過程運行 - 不僅僅是一個時間,但通過兩個foreach()循環30次迭代。

所以你要做60個全文掃描 - 祝你好運。

正確的方法是norlize上接收他們,分裂井號標籤,並建立類似hashtag | user | count

+0

謝謝歐根,看起來不舒服重新模型我的表和代碼感謝提示 – LeoSam