[英]Good Idea/Bad Idea? Using MySQL RAND() outside of a small set of subquery results?
所以在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
听起来像你在正确的轨道上。 提高MySQL使用效率的最佳方法之一是通过熟练的查询来限制数据集。
我不久前在这篇文章中重述了这个问题: http : //www.electrictoolbox.com/mysql-random-order-random-value/但我真的不想在我的数据中添加另一列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.