我有一個非常簡單的mysql請求, 1.請求調用表來獲得一個id,如果一個id存在函數結束,如果沒有id,那麼這個id不是被禁止的和第二個請求,看看id是否存在於公共表中,如果沒有,就添加,如果是,則爲頁面視圖計數1。加速對同一個mysql服務器的請求,不同表
目前這個功能似乎導致了嚴重的放緩。 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');
}
}
'mysql_num_rows(的mysql_query( 'SELECT * ...'))'似乎是它可以用'一些變化來代替 'SELECT COUNT ...''其實,前兩個查詢這個樣子。由於您不關心結果集,因此只有結果數量(實際上只有結果是否存在)可以跳過生成結果集。 – jedwards
你能告訴我一個例子嗎?或者我應該用COUNT代替* –
不要這樣做 - 那樣行不通 - 給我一分鐘,我會在答案中舉個例子。 – jedwards