我已相对于阅读速度问题通过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