优化我的随机行提取

时间:2011-12-22 16:52:21

标签: php mysql random banner

我一直在阅读有关通过MYSQL和PHP获取随机行的速度问题,并想知道如何改进我的代码以提高速度。

我的数据库中有一个名为“横幅”的表中的横幅信息,我希望显示与页面上的位置相关的随机横幅,并为该横幅的view_count添加+1。我的方法有效,但对于在每个页面加载时发生这种情况的繁忙站点,这可以提高速度吗?感谢

/* 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,但只有一半仍然存在。

3 个答案:

答案 0 :(得分:1)

在php中生成一个随机数并将其钻入PK

SQL将是

SELECT id,title,banner_url,destination 
FROM TBL_BANNERS 
WHERE id = $rand_offset

如果你错过了,请再次运行它。这样可以非常有效地寻找一行,这比使用限制/偏移处理

更好

答案 1 :(得分:1)

理想的方式,因为你可以在互联网上的许多地方阅读,例如Anton Titov's blog将进行2次查询:

SELECT COUNT(*) AS banners FROM quotes

然后在您的编程语言中生成一个随机数(即PHP使用mt_rand)。并将其提供给此查询:

SELECT * FROM banners LIMIT $generated_number, 1

注意:如果您的表只有少量行,则不适合使用。通常我仍然使用ORDER BY RAND(),直到我知道表中将有超过100行。

答案 2 :(得分:0)

而不是第一个SELECT,请使用:

$banners_count_result = mysql_query("SELECT COUNT(*) AS num_banners FROM ".TBL_BANNERS." WHERE position = '1' AND status = '1'");
$banner_count = mysql_result($banners_count_result, 0, "num_banners");

除非您每隔几秒钟添加和删除新横幅,否则请考虑在某处缓存此结果。