我有一个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()
。