随机结果。哪种方式更快的SQL查询或平面文件?

时间:2010-01-03 19:25:52

标签: php mysql random

我需要从MySQL表中显示一些随机数据(1行),性能对我来说非常重要。它不一定是绝对唯一的和超级随机数据,所以我有两个选择:

1)查询数据库(我的表有> 500 000行);

2)每周自动一次从db结果创建一个平面文本文件(或带有数组的php文件),比方说,400-500行,并从中得到一些随机结果(可能使用requre_once或类似的东西)。

哪种方式更好/更快?

谢谢。

4 个答案:

答案 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你的唯一号码得到上面的建议。