2012-06-08 77 views
0

我有一個非常簡單的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'); 
    } 
} 
+1

'mysql_num_rows(的mysql_query( 'SELECT * ...'))'似乎是它可以用'一些變化來代替 'SELECT COUNT ...''其實,前兩個查詢這個樣子。由於您不關心結果集,因此只有結果數量(實際上只有結果是否存在)可以跳過生成結果集。 – jedwards

+0

你能告訴我一個例子嗎?或者我應該用COUNT代替* –

+1

不要這樣做 - 那樣行不通 - 給我一分鐘,我會在答案中舉個例子。 – jedwards

回答

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

+0

讓我給這個一掄,生病後回來的結果和標誌,如果作品,非常感謝幫助我這個順便一提。 –

+1

您可以使用'mysql_fetch_assoc()'和'$ a ['numrows']'改變'COUNT(*)'爲'COUNT(1)'和'mysql_num_rows()'來優化更多。 –

+0

我在閱讀有關pdo的溢出,但似乎PHP。網絡故障或者我遇到問題連接。 –

相關問題