位置: 编程技术 - 正文

MySQL下的RAND()优化案例分析(mysql random函数)

编辑:rootadmin

推荐整理分享MySQL下的RAND()优化案例分析(mysql random函数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql rank(),mysqlrand()函数怎么用,mysql rand()会生成重复的随机数,mysql中rand,mysqlrand()函数怎么用,mysqlrand()函数怎么用,mysql中rand()函数怎么用,mysql中rand,内容如对您有帮助,希望把文章链接给更多的朋友!

众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行。事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时。首先,看下建表DDL,这是一个没有显式自增主键的InnoDB表:

往这个表里灌入一些测试数据,至少万以上, id 字段也是乱序的。

1、常量等值检索:

可以看到执行计划很不错,是常量等值查询,速度非常快。

2、使用RAND()函数乘以常量,求得随机数后检索:

可以看到执行计划很糟糕,虽然是只扫描索引,但是做了全索引扫描,效率非常差。因为WHERE条件中包含了RAND(),使得MySQL把它当做变量来处理,无法用常量等值的方式查询,效率很低。

我们把常量改成取t_innodb_random表的最大id值,再乘以RAND()求得随机数后检索看看什么情况:

可以看到,执行计划依然是全索引扫描,执行耗时也基本相当。

3、改造成普通子查询模式 ,这里有两次子查询

可以看到,执行计划也不好,执行耗时较慢。

4、改造成JOIN关联查询,不过最大值还是用常量表示

MySQL下的RAND()优化案例分析(mysql random函数)

这时候执行计划就非常完美了,和最开始的常量等值查询是一样的了,执行耗时也非常之快。这种方法虽然很好,但是有可能查询不到记录,改造范围查找,但结果LIMIT 1就可以了:

可以看到,虽然执行计划也是全索引扫描,但是因为有了LIMIT 1,只需要找到一条记录,即可终止扫描,所以效率还是很快的。

小结:从数据库中随机取一条记录时,可以把RAND()生成随机数放在JOIN子查询中以提高效率。

5、再来看看用ORDRR BY RAND()方式一次取得多个随机值的方式:

全索引扫描,生成排序临时表,太差太慢了。

6、把随机数放在子查询里看看:

嗯,提速了不少,这个看起来还不赖:)

7、仿照上面的方法,改成JOIN和随机数子查询关联

可以看到,全索引检索,发现符合记录的条件后,直接取得行,这个方法是最快的。

综上,想从MySQL数据库中随机取一条或者N条记录时,最好把RAND()生成随机数放在JOIN子查询中以提高效率。上面说了那么多的废话,最后简单说下,就是把下面这个SQL:

改造成下面这个:

如果想要达到完全随机,还可以改成下面这种写法:

就可以享受在SQL中直接取得随机数了,不用再在程序中构造一串随机数去检索了。

在MySQLDump中使用-w语句进行备份的方法 我们在用mysqldump备份数据时,有个选项是?where/-w,可以指定备份条件,这个选项的解释是:-w,--where=nameDumponlyselectedrecords.Quotesaremandatory我们可以做个测

MySQL中DATE_FORMATE函数使用时的注意点 今天帮同事处理一个SQL(简化过后的)执行报错:mysqlselectdate_format('--','Y-m-d')timediff('--','--');ERROR(HY):Illegalmixofcollations(utf8_general_c

关于MySQL的整型数据的内存溢出问题的应对方法 今天接到一个朋友电话说是觉的数据库被别人更改了,出现数据不对的问题。经过很久的排查是数据类型溢出了(发生问题的版本是MySQL5.1)。后来通过

标签: mysql random函数

本文链接地址:https://www.jiuchutong.com/biancheng/347341.html 转载请保留说明!

上一篇:批量杀死MySQL连接的四种方法详解(mysql批量删除数据库死锁)

下一篇:在MySQLDump中使用-w语句进行备份的方法(mysql中mysqldump)

  • 个体经营所得税核定征收2023标准
  • 专项资金支出流程
  • 核定扣除公式
  • 民营医院的财务管理制度
  • 去年的增值税普票能作废吗?
  • 设计服务需要交文化建设费吗
  • 在登记账簿时,应在记账凭证上注明所记账簿的页数
  • 公允价值变动损益属于当期损益吗
  • 委托加工物资加工完毕验收入库后作为
  • 境外增值税代扣代缴
  • 增值税普通发票税率
  • 房产税计税依据房产原值怎么算
  • 关于水利工程
  • 一般纳税人能否享受残保金优惠
  • 何为销项税额
  • 小微企业不超过300万所得税
  • 通行费如何填报表二
  • 没给顾客发票需要罚款吗
  • 小规模纳税人增值税超过30万怎么纳税
  • 应付账款对账的流程和技巧
  • 装修工程需要预缴吗
  • 固定资产应怎么做账
  • 普通发票多久之后还可以红冲
  • 工伤保险的作用有
  • 哪些抵押物必须登记才有效
  • 库存现金银行存款用什么凭证
  • 上市公司的组织形式
  • 在win7系统中,添加打印机驱动程序
  • 年终奖发放与补发的区别
  • 鸿蒙系统小艺怎么改声音
  • php字符串定义的三种方式
  • 纳税调整项目有一个其他调增金额是怎么组成的
  • 克洛格森林大克洛格
  • 新的担保法是怎么规定的
  • 详解php处理字符的方法
  • php 通信
  • php操作mysql数据库的扩展有哪三个
  • 盘点那些神级翻唱现场
  • 现金报销医药费
  • python生成器定义
  • 资本化利息支出现金流量表计入哪里
  • 为什么开发票能抵税
  • 新企业职工工资怎么算
  • 实行核定征收印花税
  • 分公司可以独立签约吗
  • 银行代发工资必须要本行的卡吗
  • 应纳税所得额是利润总额还是净利润
  • 残保金如何做会计分录
  • 股东分红会计分录
  • 研发费用不能加计扣除的有哪些项目
  • 建筑业预交税金会计分录
  • 销售折扣含义
  • 采购家具分批结算方式
  • 增值税不超过30万,普通发票可以开0税率吗
  • 有限合伙企业应纳税所得额的计算
  • 汽车属于固定资产吗?如何计提折旧
  • 尽量别熬夜
  • XP系统电脑开机密码忘了
  • vcpkgsrv.exe是什么进程
  • win7修改sid
  • linux中字符设备有哪些
  • ds是什么文件
  • linux系统坏了怎么恢复数据
  • win8.1 应用商店是不是不能用了
  • 电脑win8.1系统怎么样
  • 使用 WinSCP 管理 Linux VPS/服务器上的文件 图文教程
  • windows网慢
  • 安卓骰子游戏
  • set命令应用
  • javascript unicode与GBK2312(中文)编码转换方法
  • css怎么更换图片
  • [置顶]马粥街残酷史
  • python中字符串的方法
  • unity人物面板
  • Unity3D游戏开发标准教程
  • 理解JavaScript事件对象
  • js时间戳转日期格式
  • jQuery+ajax简单实现文件上传的方法
  • 重庆网上申报税务操作流程
  • 辽宁省医保明细查询
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设