我一直在阅读有关通过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,但只有一半仍然存在。
答案 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");
除非您每隔几秒钟添加和删除新横幅,否则请考虑在某处缓存此结果。