我已相對於閱讀速度問題通過MySQL和PHP得到一個隨機行,不知道怎麼我的代碼可能速度得到改善。我的優化排隨機取
我在一個名爲「旗幟」表數據庫歡迎信息,我想顯示相對於頁面上的位置隨機的橫幅,並添加+1到VIEW_COUNT爲這面旗幟。我的方法可行,但對於每次頁面加載都會發生這種情況的繁忙網站,這可以提高速度嗎?由於
/* Get banners for position 1 then choose a random one to display */
$banners = mysql_query("SELECT id,title,banner_url,destination FROM ".TBL_BANNERS." WHERE position = '1' AND status = '1'");
$banner_count = mysql_num_rows($banners) - 1;
$rand_offset = mt_rand(0,$banner_count);
$result = mysql_query("SELECT id,title,banner_url,destination FROM ".TBL_BANNERS." LIMIT $rand_offset, 1 ");
$banner_id = mysql_result($result,0,"id");
$banner_title = mysql_result($result,0,"title");
$banner_url = mysql_result($result,0,"banner_url");
$banner_dest = mysql_result($result,0,"destination");
/* Add view to this banner */
$database->addViewToBanner($banner_id);
最後一個函數使用查詢:
"UPDATE banners SET view_count = view_count+1 WHERE id = '$banner_id'"
我還需要多說,有可能不會成爲任何超過100條記錄中的「橫幅」表在任何一個時間,但有會在ID中漏洞。這些ID可能會上升到200,但只有一半仍然存在。
對不起,有什麼不對勁的錯'ORDER BY RAND()LIMIT 1'(實際上可能什麼不對的地方,我不是sarky,實際上,我問)? – DaveRandom 2011-12-22 16:57:44
我讀過,當你在桌子上有洞的時候,這種方式並不是隨機的。比如我現在的ID返回了原來的查詢是9,15和16 – user29660 2011-12-22 17:06:46
@DaveRandom是 - 做一個ORDER BY RAND()是資源密集型的,您注意到了很多更與數千個/百萬行的表。國際海事組織(IMO)在只有相對較少的行的表上使用它仍然很好。見http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/一個不錯的解釋。 – Nick 2011-12-22 17:09:02