使用 PHP mt_rand() 而不是 MySQL rand() 来避免查询缓慢



我有一个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)";

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

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

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

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()

最新更新