我有一个非常简单的mysql请求, 1.请求调用表获取一个id,如果一个id存在函数结束,如果没有id,那么id不被禁止和第二次请求,看看id是否存在于public table中,如果没有它添加,如果它是对页面视图计数为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');
}
}
答案 0 :(得分: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']
和$a['freerows']
来获取后续逻辑的行数。
如果您多次运行此查询,如果您使用PDO和PDO::prepare()
,可能会有一些额外的性能提升。