0

データベースに保存されている #-tag トレンド分析を実行しているテスト ページが 1 つあります。コンテンツが表示されるまでにページの読み込みに長い時間がかかります (最大 2 分)。そのページで使用された機能は 1 つだけです。

URL: 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) ;

?> 
4

1 に答える 1

3

申し訳ありませんが、データモデルに欠陥があります。

ツイートを正規化するのではなく、ハッシュタグの全文検索を(経由でhashtags like '%$key%')実行します。つまり、時間間隔内のすべてのツイートの全文は、CPUを集中的に使用するプロセスを1回だけでなく、2foreach()回実行する必要があります。それぞれ30回の反復のループ。

つまり、60回のフルテキストスキャンを実行します。幸運を祈ります。

正しい方法は、ツイートを受信して​​ハッシュタグを分割し、次のようなテーブルを作成することで、ツイートをノーラライズすることです。hashtag | user | count

于 2012-06-14T14:24:23.910 に答える