所以在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