位置: 编程技术 - 正文

分析一个MySQL的异常查询的案例(mysql在数据分析中的作用)

编辑:rootadmin

推荐整理分享分析一个MySQL的异常查询的案例(mysql在数据分析中的作用),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql分析数据,mysql在数据分析中的作用,mysql在数据分析中的作用,mysql 分析,mysql总结与分析,mysql 分析语句,mysql 分析,mysql 分析语句,内容如对您有帮助,希望把文章链接给更多的朋友!

问题

用户工单疑问:相同的语句,只是最后的limit行数不同。奇怪的是,limit 的性能比limit 的语句还慢约倍。

隐藏用户表信息,语句及结果如下

执行时间3 min 3. sec

执行时间1.Sec.

性能差距非常大!

分析MySQL Tips:追查语句执行时最常用的方法,是通过explain来看语句的执行计划。 &#;

更有冲击性的效果是通过缩小范围后,在这个数据下,limit 和limit 的执行计划相差很大。

两个执行计划:

可以看到,两个语句的执行计划不同:使用的索引不同。

MySQL Tips:explain的结果中,key表示最终使用的索引,rows表示使用这个索引需要扫描的行数,这是个估计值。

表中 索引A定义为 (f3, f4, f1, f2, f5); 索引B定义为(f1, f2, f3);

一个确认

虽然rows是估计值,但是指导索引使用的依据。既然limit 能达到rows ,说明在第一个语句优化器可选结果中,也应该有此值,为什么不会选择索引A?先确认一下我们上面的这个结论。

MySQL Tips:MySQL语法中能够用force index 来强行要求优化器使用某一个索引。

顺便说明,由于我们指定了force index,因此优化器不会考虑其他索引,possible_keys里只会显示A。我们关注的是rows:。这说明在limit 语句里,使用索引A也能够减少行扫描。

MySQL Tips:MySQL优化器会对possiable_key中的每个可能索引都计算查询代价,选择最小代价的查询计划。

分析一个MySQL的异常查询的案例(mysql在数据分析中的作用)

至此我们大概可以猜测,这个应该是MySQL实现上的bug:没有选择合适的索引,导致使用了明显错误的执行计划。

MySQL Tips:MySQL的优化器执行期间需要依赖于表的统计信息,而统计信息是估算值,因此有可能导致得到的执行计划非最优。

但要说明的是,上述Tip是客观情况造成(可接受),但本例却是例外,因此优化器实际上可以拿到能够作出选择正确结果的数据(rows值),但是最终选择错误。

原因分析

MySQL优化器是按照查询代价的估算值,来确定要使用的索引。计算这个估算值的过程,基本是按照“估计需要扫描的行数”来确定的。

MySQL Tips:MySQL在目前集团主流使用的5.1和5.5版本中只能使用前缀索引。

因此,使用索引A只能用上字段f3,使用索引B只能用上字段f1。Rows即为使用了索引查到上下界,之后需要扫描的数据行数(估算值)。

上述的语句需要用到group和order by,因此执行计划中都有Using temporary; Using filesort。流程上按顺序先计算使用索引A的查询代价。

之后依次计算其他possitabe_key的查询代价。由于过程中需要排序,在得到一个暂定结果后,需要判断是否有代价更低的排序方式(test_if_cheaper_ordering)。与之前的大同小异,也是依靠估计扫描行数来计算代价。

在这个逻辑的实现过程中,存在一个bug:在估计当前索引的区分度的时候,没有考虑到前缀索引。

即:假设表中有w行数据,索引B(f1,f2,f3),则计算索引区分度时,需要根据能够用上的前缀部分来确定。比如f1有个不同的值,则平均每个key值上的记录数为.如(f1,f2)有个同的值,则平均每个组合key上的记录数为,若(f1,f2,f3)有w个不同的值,则平均每个组合key上的记录数为1。

MySQL Tips:每个key上的记录数越少,说明使用该索引查询时效率最高。对应于show index from tbl 输出结果中的Cardinality值越大。

在这个case下,索引B只能使用f1做前缀索引,但是在计算单key上的行平均值时用的是(f1,f2,f3),这就导致估算用索引B估算的时候,得到的代价偏小。导致误选。

回到问题本身

1、 为什么limit值大的时候反而选对了呢?这是因为在计算B的查询代价时,查询需要返回的行数limit_rows也参与乘积,若limit值较大,则计算出来的B的代价就会更大,反而会由于代价。值超过A,而导致优化器最终选择A。

2、 这个表有w行数就,为什么limit相差为就差别这么大?这与语句本身有关。这个语句中有group by,这就意味着每多limit一个值,实际上需要扫描更多的行N。 这里N为“表的总行数”/“表中不同的f2值”。也就是说这个语句使得这个bug有放大作用。

解决方案

分析清楚后解决方法就比较简单了,修改代码逻辑,在执行test_if_cheaper_ordering过程中,改用字段f1的区分度来计算即可。

MySQL存储数据乱码的问题解析 mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码。今天就有一个用户反馈他数据库中的数据下午1点多

MySQL的增删查改语句用法示例总结 1.创建列altertabletablenameaddcolnametypenotnulldefault'0′;例:altertablemmanapp_mmanmediaaddappid_idintegernotnulldefault;2.删除列altertabletablenamedropcolumncolname;例:altertablemma

在C#和MySQL中存取中文字符时避免乱码的方法 当用到socket来进行网络程序开发时,大多数情况下会遇到中文字符的发送与接收,这时若对发送的字符串用默认的方式进行处理,则一般会得到一堆乱

标签: mysql在数据分析中的作用

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

上一篇:MySQL中查询的有关英文字母大小写问题的分析(mysql 查询范围)

下一篇:MySQL存储数据乱码的问题解析(mysql数据存在内存还是硬盘)

  • 新公司如何申报城市建设税
  • 如何确定开票税率是否正确
  • 教育附加税税率多少?
  • 留抵退税手续
  • 一般纳税人劳务票一般开几个点
  • 红冲上个月发票
  • 一般纳税人购销合同印花税计税依据
  • 从企业分红所得税怎么算
  • 土地入固定资产还是无形资产
  • 税务在哪查询
  • 期末留抵税额退税怎么做分录
  • 进项票错了但是销项票开出去了怎么办
  • 抵债资产账务处理2021年
  • 交易性金融资产借贷方向
  • 公允价值变动损益属于当期损益吗
  • 财产损失怎么办
  • 预收账款本期发生额怎么算
  • 未竣工验收导致发生质量问题由谁承担责任
  • 代管商品物资登记制度
  • 租赁公司运输费计入什么科目
  • 贷款损失准备对不良贷款的比率称作
  • 组织机构代码证过期
  • 蜜枣税收分类编码
  • 增资印花税增加哪个税目
  • 合伙企业如何计算缴纳个人所得税
  • 从业人数如何计算
  • 股息红利是否交个人所得税
  • 股东借款可以转为认缴出资
  • 申报缴纳印花税,取得银行缴税凭证
  • 土地增值税清算报告
  • 保证金计入哪个会计科目
  • 如何清理插件残留
  • 增值税税率类型
  • 公司未经营需要做所得税年度清缴吗
  • win10磁盘碎片整理打不开
  • 高端显卡排名
  • Micheldever Wood的蓝铃花,英国汉普郡 (© Hursley/Getty Images Plus)
  • 业务招待费有
  • 城镇土地使用税纳税义务发生时间
  • 实收资本的会计编码
  • 残保金的会计处理
  • 固定资产折旧计算方法公式大全
  • 未开票收入如何申报
  • 财务处理的时候要做什么
  • php获取当前页面url
  • iis部署javaweb
  • vue监听页面加载完毕
  • lastlog日志
  • 汇算清缴退税分录怎么写
  • 管理费用科目核算的内容
  • pd python
  • 增值税扣税凭证进项税额转出情况核实函
  • 土地增值税预缴计算方法70号公告
  • 丢失增值税发票怎么办
  • 通过法院拍卖取得的土地没有得到执行属于什么案件
  • 存货是指企业在生产经营过程中为销售或耗用
  • 月末进项税大于销项税额怎么结转
  • 什么是住房补贴,住房补贴如何办理?
  • 存货跌价准备什么科目
  • 公司的现金收入存到个人账户在转到公司指定的私人账户
  • 记账凭证错误的更正方法
  • 过次页和承前页怎么算
  • 机票的退票费会退到哪里
  • 采用分期付款方式的会计分录
  • 捐赠人赞助属于什么会计科目
  • 零退税率可以做免税吗
  • 什么是批发零售市场
  • 失控发票进项税转出企业无法承担所得税怎么办
  • 对会计人员继续教育的目的包括了保障
  • 银行承兑汇票怎么看
  • 电脑bios找不到硬盘怎么办
  • Gene6 FTP在windows 2008上面破解后无法启动解决方法
  • ubuntu20桌面
  • autorun.dll
  • msedge.exe是什么
  • 桌面预览怎么设置
  • linux挂载啥意思
  • css expression 隔行换色
  • 浅谈如何加强基层党组织建设
  • python数据的概念
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设