PHP – 好主意/坏主意?在一小组子查询结果之外使用MySQL RAND()?

所以在MySQL中,我已经读到了对于包含大量行的大型表,使用ORDER BY RAND()是一个坏主意(即使有~500行表,据说).缓慢而低效.很多行扫描.

这个(下面)如何替代?

SELECT * FROM(…通常返回一组少于20行的子查询…)ORDER BY RAND()LIMIT 8

我没有在大量数据上使用RAND(),而是选择一个小子集,然后才对这些返回的行应用RAND().在99.9%的情况下,上面看到的子查询应该选择少于20行(事实上,它通常少于8行).

很想听听人们的想法.

(仅供参考,我正在用PHP做MySQL的东西.)

谢谢!

最佳答案
实际上……我最终进行了测试,我可能已经回答了我自己的问题.我想我会在这里发布这些信息,以防它对其他人有用. (如果我在这里做错了什么,请告诉我!)

这有点令人惊讶……

与我读过的所有内容相反,我创建了一个名为TestData的表,其中包含100万行并运行以下查询:

SELECT * FROM TestData WHERE number = 41 ORDER BY RAND()LIMIT 8

…它返回的行平均为0.0070秒.我真的不明白为什么兰德()有这么糟糕的名声.它似乎对我很有用,至少在这种特殊情况下.

我的表中有三列:

id [BIGINT(20)] | textfield [tinytext] |号码[BIGINT(20)]

id上的主键,数字上的索引.

我猜MySQL很聪明,知道它只应该将RAND()应用于“WHERE number = 41”返回的20行? (我特意添加了20行,其中“数字”的值为41.)

备用子查询方法返回平均时间约为.0080秒的结果,这比非子查询方法慢.

子查询方法:SELECT * FROM(SELECT * FROM TestData WHERE number = 41)as t ORDER BY RAND()LIMIT 8

转载注明原文:PHP – 好主意/坏主意?在一小组子查询结果之外使用MySQL RAND()? - 代码日志