使用PHP mt_rand()代替MySQL rand()避免缓慢查询

时间:2018-10-07 23:06:18

标签: php mysql

我有一个PHP文件,该文件从MySQL数据库中寻找随机ID,但是当表足够大时,它就会变慢。 ID行有空白。

原始

$sql = "SELECT * FROM definiciones ORDER BY rand() LIMIT 1";

想法

$random = mt_rand(0, 10000);
$sql = "SELECT * FROM definiciones WHERE id = (SELECT max(id) FROM definitiones WHERE id < $random)";

我事先知道数据库中的确切行数。替换原始查询是一个好主意吗?

1 个答案:

答案 0 :(得分:2)

  

替换原始查询是一个好主意吗?

是的,但是有一种更简单的表达方式:

SELECT * FROM definiciones WHERE id >= ? ORDER BY id LIMIT 1

?设置为介于0和表中最大ID之间的随机数。


现在,有一个改进:如果id的值中有任何空白,则前一种方法的结果将有些偏斜。 (例如,如果没有id < 100的行,那么id = 100的行将比id = 101的行被选择的频率高得多。)可以通过使用单独的列来避免这种情况。进行随机化。首先,您需要添加以下列:

ALTER TABLE definiciones ADD COLUMN randomval FLOAT NOT NULL,
                         ADD KEY randomval (randomval);
UPDATE TABLE definiciones SET randomval = RAND();

然后,选择一个随机选择的项目:

SELECT * FROM definiciones WHERE randomval > ? LIMIT 1;

使用0到1之间的随机值作为参数。

极少有机会不返回任何行(如果RAND()选择的值大于表中的最大值)。如果发生这种情况,请重复查询。

向表中插入新行时,您需要设置randomval = RAND()