MySQL 的 ORDER BY RAND()
是一种获取随机数据库条目的简单方法。 然而,使用此方法检索多个随机行变得非常慢,尤其是对于大型数据集。
考虑此查询旨在选择 18 个随机用户配置文件:
<code class="language-sql">SELECT u.id, p.photo FROM users u, profiles p WHERE p.memberid = u.id AND p.photo != '' AND (u.ownership=1 OR u.stamp=1) ORDER BY RAND() LIMIT 18</code>
效率低下源于ORDER BY RAND()
在应用LIMIT
子句之前对整个结果集进行排序的固有需求。
更有效的方法
卓越的策略利用索引列来显着加快随机选择速度。 这是一个优化的查询:
<code class="language-sql">SELECT g.* FROM table g JOIN (SELECT id FROM table WHERE RAND() < (SELECT 4 / COUNT(*) ) * 10 LIMIT 4) AS subquery ON g.id = subquery.id;</code>
优化说明
此修订后的查询包含多项关键改进:
RAND()
根据总行数的百分比来过滤行。 对 id
列(或 WHERE
子句中使用的任何列)建立索引可以快速识别行。LIMIT
子句必须相同。WHERE
条件,保证数据完整性。此方法显着减少了查询执行时间,即使对于大量表也是如此,为检索多个随机结果提供了更具可扩展性的解决方案。
结论
这些优化技术在处理 MySQL 中的随机数据选择时提供了显着的性能提升。 通过避免 ORDER BY RAND()
,您可以创建更高效、更健壮的数据库应用程序。
以上是如何在不使用 ORDER BY RAND() 的情况下从数据库中高效检索多个随机结果?的详细内容。更多信息请关注PHP中文网其他相关文章!