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

Php 随机结果。SQL查询或平面文件哪种方式更快?,php,mysql,random,Php,Mysql,Random,我需要显示MySQL表中的一些随机数据(1行),性能对我来说非常重要。它不一定是绝对唯一和超级随机的数据,所以我有两个选择: 1) 查询数据库(我的表有>500000行) 2) 每周自动从数据库结果中创建一个平面文本文件(或带有数组的php文件),比如400-500行,并从中获得一些随机结果(可能使用requre\u once或类似的方法) 哪条路更好/更快 谢谢。查询数据库 但不是通过询问 SELECT * FROM tablename ORDER BY rand() LIMIT 1 因为这

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

1) 查询数据库(我的表有>500000行)

2) 每周自动从数据库结果中创建一个平面文本文件(或带有数组的php文件),比如400-500行,并从中获得一些随机结果(可能使用
requre\u once
或类似的方法)

哪条路更好/更快

谢谢。

查询数据库

但不是通过询问

SELECT * FROM tablename ORDER BY rand() LIMIT 1
因为这会给每一行分配一个随机数,然后返回最大值

相反,计算行数,然后在此值内获取一个随机数并返回该行

$numrows = mysql_num_rows();
$r = rand(0, $numrows-1);
$sql = "SELECT * FROM tablename LIMIT $r, 1";
查询数据库

但不是通过询问

SELECT * FROM tablename ORDER BY rand() LIMIT 1
因为这会给每一行分配一个随机数,然后返回最大值

相反,计算行数,然后在此值内获取一个随机数并返回该行

$numrows = mysql_num_rows();
$r = rand(0, $numrows-1);
$sql = "SELECT * FROM tablename LIMIT $r, 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时则更快。

绝对不要使用许多人使用的技巧:

SELECT * FROM MyTable ORDER BY RAND() LIMIT 1;
这个查询看起来很简单,但它肯定是性能杀手

这可能是一个快速的解决方案:

SELECT * FROM MyTable WHERE id > RAND() * (SELECT MAX(*) FROM MyTable) LIMIT 1;

这有一些异常情况,例如更频繁地拾取间隙后面的行。但你说你想要的是快速,而不是准确。请注意,使用InnoDB之类的事务表时,
MAX()
COUNT()
等聚合速度较慢,而使用MyISAM时速度较快。

本网站和谷歌上有大量关于如何有效地通过查询获得随机结果的资料,因此应注意“如何正确编写查询”问题


对于第二部分,如果您希望整个星期/天/小时都有相同的结果,那么您可以轻松地编写一个cronjob,将结果写入一个文件,并让您的应用程序从该文件中提取。下次运行cronjob时,它将覆盖文件的旧版本,为应用程序提供新的结果。这个cronjob甚至可以生成您的HTML(或任何东西),并将静态页面放入您的web层次结构中,从而使您能够从web服务器的缓存中获益。web服务器的缓存应该可以解决磁盘与数据库I/O之间的问题,如果您的数据库通常处于重载状态,那么最终可能会对您有所帮助。

本网站和谷歌上有大量关于如何有效地通过查询获得随机结果的资料,因此应该解决您的“如何正确编写查询”问题


对于第二部分,如果您希望整个星期/天/小时都有相同的结果,那么您可以轻松地编写一个cronjob,将结果写入一个文件,并让您的应用程序从该文件中提取。下次运行cronjob时,它将覆盖文件的旧版本,为应用程序提供新的结果。这个cronjob甚至可以生成您的HTML(或任何东西),并将静态页面放入您的web层次结构中,从而使您能够从web服务器的缓存中获益。web服务器的缓存应该可以解决磁盘与数据库I/O之间的问题,如果您的数据库通常处于重载状态,那么最终可能会对您有所帮助。

如果您的表具有增量唯一ID,则只需

SELECT * FROM table WHERE id = $r

使用$r,您可以根据上述建议获得您的唯一号码

如果您的表具有增量唯一ID,则

SELECT * FROM table WHERE id = $r

使用$r,您可以根据上述建议获得您的唯一号码

请注意,使用InnoDB计算行数很慢。谢谢,我没有意识到这一点。
mysql\u num\u rows()
返回结果集中的行数,而不是表中的行数。请注意,使用InnoDB计算行数很慢。谢谢,我没有意识到这一点。
mysql\u num\u rows()
返回结果集中的行数,而不是表中的行数。我相信您的第二个查询将比第一个查询更慢,因为它会生成一个rand,并为每个单个查询计算表中的值数row@Adam:你会这么想的,但实际上,第二个查询更具可伸缩性—请参阅:我相信第二个查询将比第一个查询更慢,因为它会生成一个rand并计算表中每一个查询的值的数量row@Adam:你会这么想的,但实际上,第二个查询更具可扩展性-请参阅:关于该问题的一些详细讨论:关于该问题的一些详细讨论: