0

私はかなり単純な mysql リクエストを持っています。いいえ、追加します。追加した場合は、ページ ビューに対して 1 カウントアップします。

現在、この機能は深刻な速度低下を引き起こしているようです。af_ban テーブルには約 8000 行あり、af_freefeed テーブルには約 1,000,000 行あります。1 日あたり約 10,000 行が追加されます。

function pageview($pageid, $pagename){
$sql=mysql_num_rows(mysql_query("SELECT * FROM anotherfeedv3.af_ban WHERE pageid = '".$pageid."'"));
    if(!$sql){
        $sql=mysql_num_rows(mysql_query("SELECT pageid FROM anotherfeedv3.af_freefeed WHERE pageid = '".$pageid."'"));
            if(!$sql){
            $sql = 'INSERT INTO `anotherfeedv3`.`af_freefeed` (`id`, `pageid`, `userid`, `views`, `pagename`) VALUES (NULL, \''.$pageid.'\', \'\', \'1\', \''.htmlspecialchars($pagename, ENT_QUOTES).'\');';
            $insert=mysql_query($sql) or die ('Error! in Insert '.$pageid.' SQL');
            }else{
            $sql = 'UPDATE `anotherfeedv3`.`af_freefeed` SET `pagename` = \''.htmlspecialchars($pagename, ENT_QUOTES).'\', views=views+1 WHERE `af_freefeed`.`pageid` = '.$pageid.';';
            //$sql = 'UPDATE `anotherfeedv3`.`af_freefeed` SET views=views+1 WHERE `af_freefeed`.`pageid` = '.$pageid.';';
            $update=mysql_query($sql) or die ('Failed update of '.$pageid.' in mysql.');
        }
    }
};

これを書くより良い方法はありますか?


解決!

function pageview($pageid, $pagename){
$q = sprintf('SELECT COUNT(*) AS numrows FROM anotherfeedv3.af_ban WHERE pageid = %d', $pageid);
$r = mysql_query($q);
$a = mysql_fetch_assoc($r);
if($a['numrows'] > 0){ /* ... */ }else {
    $q = sprintf('SELECT COUNT(*) AS numrows FROM anotherfeedv3.af_freefeed WHERE pageid = %d', $pageid);
    $r = mysql_query($q);
    $a = mysql_fetch_assoc($r);
    if($a['numrows'] > 0){ /* ... */ 
    $sql = 'UPDATE `anotherfeedv3`.`af_freefeed` SET `pagename` = \''.htmlspecialchars($pagename, ENT_QUOTES).'\', views=views+1 WHERE `af_freefeed`.`pageid` = '.$pageid.';';
            //$sql = 'UPDATE `anotherfeedv3`.`af_freefeed` SET views=views+1 WHERE `af_freefeed`.`pageid` = '.$pageid.';';
    $update=mysql_query($sql) or die ('Failed update of '.$pageid.' in mysql.');
    }else {
    $sql = 'INSERT INTO `anotherfeedv3`.`af_freefeed` (`id`, `pageid`, `userid`, `views`, `pagename`) VALUES (NULL, \''.$pageid.'\', \'\', \'1\', \''.htmlspecialchars($pagename, ENT_QUOTES).'\');';
            $insert=mysql_query($sql) or die ('Error! in Insert '.$pageid.' SQL');
    }
}
4

1 に答える 1

1

これらの行で:

$sql=mysql_num_rows(mysql_query("SELECT * FROM anotherfeedv3.af_ban WHERE pageid = '".$pageid."'"));
if(!$sql){ /* ... */ }

結果が存在するかどうかのみに関心があるようです。

その場合は、次のように置き換えることができます。

$q = sprintf('SELECT COUNT(*) AS numrows FROM anotherfeedv3.af_ban WHERE pageid = %d', $pageid);
$r = mysql_query($q);
$a = mysql_fetch_assoc();
if($a['numrows'] > 0){ /* ... */ }

これを要約することもできますが、理解を容易にするためにかなり自由に分割しました。

基本的に、これにより、MySQL は結果セットを生成せずに行数を決定できます。

さらに、この手法を使用して最初の 2 つのクエリを組み合わせることができます。

$q = 'SELECT (';
$q.= '    SELECT COUNT(*) FROM anotherfeedv3.af_ban WHERE pageid = %d';
$q.= ') AS banrows, (';
$q.= '    SELECT COUNT(*) FROM anotherfeedv3.af_freefeed WHERE pageid = %d';
$q.= ') AS freerows';
$r = mysql_query(sprintf($q, $pageid, $pageid);
$a = mysql_fetch_assoc();

クエリの結果は、2 つの列 (banrows、freerows) を持つ 1 つの行になります。値は、上記のそれぞれのクエリに一致する行数になります。

$a['banrows']その後、 andを使用し$a['freerows']て、後のロジックの行数を取得します。

このクエリを複数回実行している場合、PDO とPDO::prepare().

于 2012-06-09T00:13:25.770 に答える