Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加快对相同mysql服务器、不同表的请求_Php_Mysql - Fatal编程技术网

Php 加快对相同mysql服务器、不同表的请求

Php 加快对相同mysql服务器、不同表的请求,php,mysql,Php,Mysql,我有一个非常简单的mysql请求, 1.请求调用表以获取id,如果id存在,函数结束,如果没有id,则该id不被禁止,第二次请求,查看该id是否存在于公共表中,如果不存在,则添加,如果存在,则页面视图计数为1 目前,该功能似乎导致了严重的减速。 af_ban表大约有8000行 af_freefeed表大约有1000000行。每天大约增加10000行 function pageview($pageid, $pagename){ $sql=mysql_num_rows(mysql_query("SE

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

目前,该功能似乎导致了严重的减速。 af_ban表大约有8000行 af_freefeed表大约有1000000行。每天大约增加10000行

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');
    }
}
使用这些行:

$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']
$a['freerows']
来获取后续逻辑的行数


如果您多次运行此查询,那么如果您使用PDO和。

mysql\u num\u rows(mysql\u query('SELECT*…'))
似乎可以将其替换为
'SELECT COUNT…'
实际上,前两个查询是这样的。由于您并不真正关心结果集,因此只有结果的数量(实际上,只有结果是否存在)跳过生成结果集。您能给我举个例子吗?或者,我应该用No.To替换**,不要这样做,那就不起作用了。给我一分钟,我会在一个答案中抛出一个例子。这不回答你的问题,但是你知道,你可能想考虑使用,因为不赞成的<代码> MySQLYQuase方法对SQL注入非常脆弱。谢谢上帝,我对mysql还是相当陌生,所以任何信息都很有用,请让我来尝试一下,如果有效,我会发回结果并标记,非常感谢您在这方面的帮助。您可以通过将
COUNT(*)
更改为
COUNT(1)
mysql\u num\u rows()
而不是使用
mysql\u fetch\u assoc()
$a['numrows']
我在溢出上读到了关于pdo的文章,但似乎php.net已经关闭或者我的连接有问题。
COUNT(1)
会进一步优化它,特别是当表包含多列时,但是
mysql\u num\u rows()
在我描述的单一查询情况下不起作用,并且可能会降低性能,因为您需要mysql生成一个结果集来计算行数。@jedwards您关于
mysql\u num\u rows()的说法是对的。
,对此表示抱歉。我认为如果您使用
COUNT()
函数,使用
SELECT 1
,可能可以优化更多(我还没有进行基准测试)。