繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM