首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速对同一个mysql服务器、不同表的请求

问加速对同一个mysql服务器、不同表的请求
EN

Stack Overflow用户
提问于 2012-06-08 23:57:40
回答 1查看 145关注 0票数 0

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

目前,这一功能似乎导致了严重的减速。af_ban表大约有8000行,af_freefeed表大约有1,000,000行。每天增加大约10,000行。

代码语言:javascript
复制
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.');
        }
    }
};

有更好的方法我可以写这个吗?

解决办法!

代码语言:javascript
复制
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');
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 00:13:25

这些行:

代码语言:javascript
复制
$sql=mysql_num_rows(mysql_query("SELECT * FROM anotherfeedv3.af_ban WHERE pageid = '".$pageid."'"));
if(!$sql){ /* ... */ }

看来你只对结果是否存在感兴趣。

如果是这样的话,您可以将其替换为以下内容:

代码语言:javascript
复制
$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在不生成结果集的情况下确定行数。

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

代码语言:javascript
复制
$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();

查询的结果将是一行,其中有两列(横幅行、自由行)。这些值将是与上述查询相匹配的行数。

然后,您将使用$a['banrows']和$a['freerows']来获取稍后逻辑的行计数。

如果您多次运行此查询,如果使用PDO和PDO::prepare(),可能会看到一些额外的性能改进。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10957289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档