「MySQL」一开工,就遇到上亿(MySQL)大表的优化,我的天啊!
背景 XX实例(一主一从)xxx告警中每天凌晨在报SLA报警 , 该报警的意思是存在一定的主从延迟(若在此时发生主从切换 , 需要长时间才可以完成切换 , 要追延迟来保证主从数据的一致性)
XX实例的慢查询数量最多(执行时间超过1s的sql会被记录) , XX应用那方每天晚上在做删除一个月前数据的任务
分析 使用pt-query-digest工具分析最近一周的mysql-slow.logpt-query-digest --since=148h mysql-slow.log | less结果第一部分
本文插图
最近一个星期内 , 总共记录的慢查询执行花费时间为25403s , 最大的慢sql执行时间为266s , 平均每个慢sql执行时间5s , 平均扫描的行数为1766万
结果第二部分
本文插图
select arrival_record操作记录的慢查询数量最多有4万多次 , 平均响应时间为4s , delete arrival_record记录了6次 , 平均响应时间258s
select xxx_record语句select arrival_record 慢查询语句都类似于如下所示 , where语句中的参数字段是一样的 , 传入的参数值不一样select count(*) from arrival_record where product_id=26 and receive_time between '2019-03-25 14:00:00' and '2019-03-25 15:00:00' and receive_spend_ms>=0\G
本文插图
select arrival_record 语句在mysql中最多扫描的行数为5600万、平均扫描的行数为172万 , 推断由于扫描的行数多导致的执行时间长
查看执行计划
本文插图
用到了索引IXFK_arrival_record , 但预计扫描的行数很多有3000多w行
本文插图
本文插图
现在已经知道了在慢查询中记录的select arrival_record where语句传入的参数字段有 product_id , receive_time , receive_spend_ms , 还想知道对该表的访问有没有通过其它字段来过滤了?
神器tcpdump出场的时候到了
使用tcpdump抓包一段时间对该表的select语句
tcpdump -i bond0 -s 0 -l -w - dst port 3316 | strings | grep select | egrep -i 'arrival_record' >/tmp/select_arri.log 获取select 语句中from 后面的where条件语句
IFS_OLD=$IFSIFS=$'\n'for i in `cat /tmp/select_arri.log `;do echo ${i#*'from'}; done | lessIFS=$IFS_OLD
本文插图
综上所示 , 优化方法为 , 删除复合索引IXFK_arrival_record , 建立复合索引idx_sequence_station_no_product_id , 并建立单独索引indx_receive_time
delete xxx_record语句
本文插图
该delete操作平均扫描行数为1.1亿行 , 平均执行时间是262s
delete语句如下所示 , 每次记录的慢查询传入的参数值不一样
delete from arrival_record where receive_time < STR_TO_DATE('2019-02-23', '%Y-%m-%d')\G
执行计划
推荐阅读
- 半尺笔锋▲恰巧遇到前男友和他女朋友,幽默笑话:放假休息一个人去逛逛街
- 「育儿小手册」遇到了一个特殊盒子,里边的物资无法拾取,“吃鸡”把对手淘汰后
- 「育儿小手册」实力不允许我猥琐,王者荣耀:排位遇到脆皮阵容
- 索比光伏网■腾晖光伏5GW高效光伏组件新扩项目开工建设,总投资20亿元
- 『全市』莱芜区参加全市重点项目集中开工分会场活动
- 『扦插』农村山间的野果,却是味难得中草药,遇到请珍惜,种植有妙招
- 『复岗率』工信部:全国规模以上工业企业平均开工率98.6% 中小企业复工率达76%
- [宋庄镇]15亿!这一全国之最开工在即!通州这个镇又添一高端区域!
- [家有汽车]比夏朗都漂亮,1.6T+165马力,油耗6.6L,别克GL6遇到“强敌”
- 图说武器装备■F35遇到尴尬之事,美方也是无可奈何,测试工厂无法正常生产
