优化缓慢的 ORDER BY RAND() 查询

2024-04-19

我有一个正在使用的查询ORDER BY RAND()但这需要太长时间,而且随着数据的增长,情况会变得更糟。

该查询连接两个表,返回 5 个随机产品以及每个产品的随机图像

表 1 - 产品

product_id - pk auto-inc
name 
description

Data

1 - product 1 - description
2 - product 2 - description

表 2 - 产品图像

image_id   - pk auto-inc
product_id - fk index
filename

Data

1 - 1 - product 1 image
2 - 1 - product 1 image
3 - 1 - product 1 image
4 - 2 - product 2 image

...

我读了this https://stackoverflow.com/questions/4209886/mysql-select-random-row-with-join-from-two-tables and this http://jan.kneschke.de/projects/mysql/order-by-rand/但找不到优化查询的方法,所以我寻求帮助。 提前致谢。


ORDER BY RAND()速度很慢,因为 DBMS 必须读取所有行,对它们进行排序,只保留几行。因此,该查询的性能在很大程度上取决于表中的行数,并且随着行数的增加而降低。

没有办法优化它。

不过,还有其他选择:

你可以实施“随机获取 5 行”通过执行 6 次查询:

  • 获取表中的行数(您可以缓存这一行)
  • 执行 5 次查询OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1(即从某个随机偏移量读取并仅返回一行)

    例如:SELECT * FROM Products OFFSET 42 LIMIT 1(注:暂不加入)

    此类查询非常快,并且运行时间几乎与表大小无关。

这应该是much比...快ORDER BY RAND().


现在,要为每个随机产品获取随机图像:

SELECT *
FROM (
    SELECT *
    FROM Products
    OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON   pi.product_id = p.id
ORDER BY RAND()
LIMIT 1

内部查询仍然很快,外部查询仅对几行进行排序(假设每个产品的图像很少),因此仍然可以使用 order by rand()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化缓慢的 ORDER BY RAND() 查询 的相关文章

随机推荐

  • Task.Result 始终为 null

    我正在编写一些代码来通过 Task Factory FromAsync 在 WP7 应用程序中 执行 HttpRequest 任务的 Result 属性始终为 null 但我知道请求本身是正确的 因为如果我将其粘贴到浏览器或 Fiddler
  • 如何使用 html 5 跳转到视频位置

    我想使用 html5 video 标签来播放我的视频 如何设置视频开始播放的时间 例如我的视频长 90 秒 我想在 30 秒时开始播放
  • 程序崩溃并显示 0xC000000D 并且没有异常 - 如何调试它?

    我有一个使用第三方库的 Visual C 9 Win32 应用程序 当使用一组特定参数调用该库中的函数时 程序会崩溃并显示 异常代码 0xC000000D 我尝试附加 Visual Studio 调试器 没有抛出异常 C 也没有像访问冲突那
  • Java ExecutorService:awaitTermination所有递归创建的任务

    我用一个ExecutorService执行任务 该任务可以递归地创建提交给同一个任务的其他任务ExecutorService这些子任务也可以做到这一点 我现在遇到的问题是我想等到所有任务都完成 即所有任务都完成并且他们没有提交新任务 才继续
  • Xcode 将文件框中的 gpx 文件显示为灰色

    我希望我没有忽略任何事情 但我无法将 gpx 文件加载到 Xcode 中 因为它们在文件框中显示为灰色 见图 这在两个位置菜单中都有 在调试器 位置菜单中 参见下图 将 GPX 文件添加到项目 和 场景位置菜单 然而 预设 伦敦等 确实有效
  • 如何总结不同的groupby组合?

    我正在编制一份按县列出的前 3 名作物的表格 有些县的农作物品种相同 顺序相同 其他县也有相同的作物品种 但顺序不同 df1 pd DataFrame County Harney Baker Wheeler Hood River Wasco
  • 如何使用@types/express-session?

    当我写这个时 import Request from express serve static core router post req Request res next gt req session user user tsc给我一个错误
  • 在eclipse中安装了深色主题,但滚动条仍然是灰色的

    我在用日食月神 4 4 0 并试图让它完全黑暗 所以我安装了一个主题插件 Eclipse菜单 gt 帮助 gt Eclipse Marketplace 搜索 Eclipse Color Theme Plugin 在 Windows 首选项
  • 从 Windows 服务中的 OnStart 立即触发计时器_elapsed

    我正在使用一个System Timers Timer我的代码中有如下代码OnStartC Windows 服务中的方法 timer new Timer timer Elapsed timer Elapsed timer Enabled tr
  • 空的、不可编辑的 pg_hba.conf 文件

    我正在尝试使用本教程将我的 Sinatra 应用程序连接到 PostgreSQL 数据库 http samuelstern wordpress com 2012 11 28 making a simple database driven w
  • 不兼容的库版本:nokogiri.bundle 需要版本 11.0.0 或更高版本,但 libxml2.2.dylib

    当我尝试在 Hartl 的教程中运行 rspec 时 出现此错误 我用谷歌搜索了该错误 但它从来都不是针对特定版本的 而且修复程序实际上并不能解决我的问题 Users Jimbo rvm gems ruby 2 0 0 p247 gems
  • D3可折叠树不同节点颜色

    我在 d3 js 中有一个可折叠的树 我的目标是通过 类型 属性为节点着色 例如 类型 str 的节点应填充为红色 而类型 elem 的节点应填充为绿色 我就是无法让它发挥作用 有人能帮助我吗 这是我的代码
  • Android 资产、C、JNI

    如何使用 JNI 从 C 访问 Android 资产 例如 txt 文件 我正在尝试 file android asset myFile txt 以及本地 myFile txt 其中包含 jni 文件夹中的 myFile txt 副本以及
  • ActionMailer 和 Exchange

    我使用 Rails 应用程序和 Postfix 服务器成功通过 SMTP 发送邮件 现在我需要转移到启用了 POP3 和 SMTP 支持的 Exchange Microsoft ESMTP MAIL 服务 版本 6 0 3790 3959
  • SQL数据库自动备份[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 SQL 数据库 我需要每天 至少 备份它 最好每天多次 自动 这样它肯定会完成 我正在运行
  • emacs - 如何在子目录中进行查找文件搜索

    我想为 Emacs 实现类似 Resharper 的 转到文件 功能 当按下上述快捷键时 Resharper 会弹出一个接受通配符字符串的文本框 并显示一个自动完成菜单 其中列出了项目中与该通配符匹配的所有文件 source jetbrai
  • 鼠标悬停时显示链接

    我有页面的某些区域 单击这些区域时 会将用户重定向到某些地址 我的问题是 当用户 将鼠标悬停在 这些区域上时 他们会看到一个指针 但不知道它链接到哪里 就我的目的而言 用户知道他们被链接到哪里是很重要的 我相信当您将鼠标悬停在链接上时 Go
  • 保存图片到mongodb

    我正在尝试使用龙卷风 石油和 mongodb 来做到这一点 avat self request files avatar 0 body nomfich self request files avatar 0 filename try ima
  • Symfony2 Doctrine2 内存泄漏/超出内存限制

    我在symfony2和doctrine2的结合上遇到了很多麻烦 我必须处理巨大的数据集 大约 2 3 百万次写入和读取 并且必须做大量额外的工作以避免内存不足 我找出了两个要点 即 泄漏 内存 它们实际上并不是真正泄漏 而是分配了很多内存
  • 优化缓慢的 ORDER BY RAND() 查询

    我有一个正在使用的查询ORDER BY RAND 但这需要太长时间 而且随着数据的增长 情况会变得更糟 该查询连接两个表 返回 5 个随机产品以及每个产品的随机图像 表 1 产品 product id pk auto inc name de