我需要从MySQL表中显示一些随机数据(1行),性能对我来说非常重要。它不一定是绝对唯一的和超级随机数据,所以我有两个选择:
1)查询数据库(我的表有> 500 000行);
2)每周自动一次从db结果创建一个平面文本文件(或带有数组的php文件),比方说,400-500行,并从中得到一些随机结果(可能使用requre_once
或类似的东西)。
哪种方式更好/更快?
谢谢。
答案 0 :(得分:2)
查询数据库。
但不是通过查询
SELECT * FROM tablename ORDER BY rand() LIMIT 1
因为这会为每一行分配一个随机数,然后返回最大值。
相反,计算行数,然后在此值中获取一个随机数并返回该行
$numrows = mysql_num_rows();
$r = rand(0, $numrows-1);
$sql = "SELECT * FROM tablename LIMIT $r, 1";
答案 1 :(得分:1)
绝对不使用很多人使用的技巧:
SELECT * FROM MyTable ORDER BY RAND() LIMIT 1;
该查询看起来很简单,但肯定会成为性能杀手。
这可能是一个快速的解决方案:
SELECT * FROM MyTable WHERE id > RAND() * (SELECT MAX(*) FROM MyTable) LIMIT 1;
这有一些异常现象,例如更频繁地选择跟随差距的行。但是你说你想要快速,不准确。请注意,使用像InnoDB这样的事务表时,MAX()
和COUNT()
等聚合会更慢,而使用MyISAM时会更快。
答案 2 :(得分:0)
关于如何有效地在您的网站和Google上查询随机结果有很多材料,因此应该注意您的“如何正确编写查询”问题。
对于你的第二部分,如果你想要整周/日/小时的相同结果,那么你可以轻松编写一个获取结果的cronjob,将其写入文件,并从该文件中取出应用程序。下次运行cronjob时,它将覆盖旧版本的文件,为您的应用程序提供新结果。这个cronjob甚至可以生成您的HTML(或其他),并将静态页面放在Web层次结构中,从而使您可以从Web服务器的缓存中受益。 Web服务器的缓存应该否定磁盘与数据库I / O问题,如果您的数据库通常处于高负载状态,最终可能会帮助您。
答案 3 :(得分:0)
如果您的表具有增量唯一ID,则只需
SELECT * FROM table WHERE id = $r
用$ r你的唯一号码得到上面的建议。