文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL查询中Sending data占用大量时间怎么办

2024-04-02 19:55

关注

这篇文章主要介绍了MySQL查询中Sending data占用大量时间怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

原SQL执行计划:

EXPLAIN

SELECT tm.id,

tm.to_no ,

tm.source_website_id ,

tm.warehouse_name ,

tm.target_website_id ,

tm.channel_name ,

tm.sale_channel_name ,

ti.product_basic_id ,

ti.product_basic_no ,

ti.product_basic_name ,

ti.tax_rate ,

ti.sale_tax_rate ,

ti.quantity/ti.main_aux_ratio quantity ,

ti.unit_cost * ti.main_aux_ratio unit_cost,

ti.unit_cost * IFNULL(ti.quantity,0) amount,

ti.received_qty,

tm.po_no ,

tm.source_website_name,

tm.target_website_name,

createUser.user_name create_user_name,

auditUser.user_name audit_user_name,

outUser.user_name out_user_name,

DATE_FORMAT(tm.create_time, '%Y/%m/%d %H:%i:%s') create_time ,

DATE_FORMAT(tp.audit_time, '%Y/%m/%d %H:%i:%s') audit_time ,

DATE_FORMAT(tp.out_time, '%Y/%m/%d %H:%i:%s') out_time ,

tm.`status`,

DATE_FORMAT(tp.in_time, '%Y/%m/%d %H:%i:%s') receive_time,

IFNULL(ti.return_qty/ti.main_aux_ratio, 0) return_qty,

ti.unit_cost * IFNULL(ti.received_qty,0) return_amount,

DATE_FORMAT(td.production_date, '%Y/%m/%d') production_date,

td.location_name off_location_name FROM transfer_master AS tm

LEFT JOIN transfer_item AS ti ON tm.id = ti.to_id

LEFT JOIN transfer_detail td ON tm.id = td.transfer_id AND ti.product_basic_id = td.product_basic_id

LEFT JOIN transfer_operation tp ON tp.transfer_id = tm.id

LEFT JOIN sys_user createUser ON createUser.sysno = tm.create_user_id

LEFT JOIN sys_user auditUser ON auditUser.sysno = tp.audit_user_id

LEFT JOIN sys_user outUser ON outUser.sysno = tp.out_user_id WHERE 1 = 1 AND tm.source_website_id IN (3) AND tm.status = 110 AND tm.create_time >= '2019-04-01' AND tm.create_time < '2019-10-01' ORDER BY tm.create_time DESC

MySQL查询中Sending data占用大量时间怎么办以上SQL很多列没有用到索引。

1 queries executed, 1 success, 0 errors, 0 warnings

查询:SELECT tm.id, tm.to_no , tm.source_website_id , tm.warehouse_name , tm.target_website_id , tm.channel_name , tm.sale_channel_nam...

共 1000 行受到影响

执行耗时   : 1 min 10 sec

传送时间   : 0.016 sec

总耗时      : 1 min 10 sec

MySQL查询中Sending data占用大量时间怎么办

Sending data花费时间最长。

“Sending data”状态的含义,原来这个状态的名称很具有误导性,所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。

对字段添加索引。

第一条索引:ALTER TABLE `transfer_detail` ADD INDEX idx_transfer_id (`transfer_id`);

第二条索引:ALTER TABLE `transfer_item` ADD INDEX idx_to_id (`to_id`);

第三条索引:ALTER TABLE `transfer_operation` ADD INDEX idx_transfer_id (`transfer_id`);

加第一条索引:ALTER TABLE `transfer_detail` ADD INDEX idx_transfer_id (`transfer_id`);

执行计划:

MySQL查询中Sending data占用大量时间怎么办消耗时间:

MySQL查询中Sending data占用大量时间怎么办

加第二条索引:ALTER TABLE `transfer_item` ADD INDEX idx_to_id (`to_id`);

执行计划:

MySQL查询中Sending data占用大量时间怎么办消耗时间:

MySQL查询中Sending data占用大量时间怎么办

加第三条索引:ALTER TABLE `transfer_operation` ADD INDEX idx_transfer_id (`transfer_id`);

执行计划:

MySQL查询中Sending data占用大量时间怎么办消耗时间:

MySQL查询中Sending data占用大量时间怎么办

优化完成。

tm表的条件字段数据分布不均匀,不建议加索引。

对条件字段添加索引后,Sending data消耗时间大幅下降。

感谢你能够认真阅读完这篇文章,希望小编分享的“MySQL查询中Sending data占用大量时间怎么办”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯