我有一个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)";
我事先知道数据库中的确切行数。替换原始查询是一个好主意吗?
答案 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()
。