0

我有一个非常简单的mysql请求,1.请求调用表获取id,如果id存在函数结束,如果没有id,则id不被禁止,第二次请求,查看id是否存在于公共表中,如果不,它添加了,如果它添加了它,则页面视图计数为 1。

目前,此功能似乎正在导致严重的减速。af_ban 表有大约 8000 行 af_freefeed 表有大约 1,000,000 行。每天添加大约 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 在不生成结果集的情况下确定行数。

此外,您可以使用此技术来组合前两个查询:

$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();

查询的结果将是一行两列(banrows、freerows)。这些值将是与上述相应查询匹配的行数。

然后,您将使用$a['banrows']and$a['freerows']为您以后的逻辑获取行数。

如果您多次运行此查询,如果您使用 PDO 和PDO::prepare().

于 2012-06-09T00:13:25.770 回答