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


这篇文章主要介绍了MySQL查询中Sending data占用大量时间怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原SQL执行计划:EXPLAINSELECT 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 tmLEFT JOIN transfer_item AS ti ON tm.id = ti.to_idLEFT JOIN transfer_detail td ON tm.id = td.transfer_id AND ti.product_basic_id = td.product_basic_idLEFT JOIN transfer_operation tp ON tp.transfer_id = tm.idLEFT JOIN sys_user createUser ON createUser.sysno = tm.create_user_idLEFT JOIN sys_user auditUser ON auditUser.sysno = tp.audit_user_idLEFT 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
以上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 secSending 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`);执行计划:消耗时间:加第二条索引:ALTER TABLE `transfer_item` ADD INDEX idx_to_id (`to_id`);执行计划:消耗时间:加第三条索引:ALTER TABLE `transfer_operation` ADD INDEX idx_transfer_id (`transfer_id`);执行计划:消耗时间:优化完成。tm表的条件字段数据分布不均匀,不建议加索引。
对条件字段添加索引后,Sending data消耗时间大幅下降。感谢你能够认真阅读完这篇文章,希望小编分享的“MySQL查询中Sending data占用大量时间怎么办”这篇文章对大家有帮助,同时也希望大家多多支持开发云,关注开发云行业资讯频道,更多相关知识等着你来学习!

相关推荐: mysql如何查看命令历史

本篇文章为大家展示了mysql如何查看命令历史,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.在DOS窗口中运行进入数据库2.查看历史命令MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 …

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/22 17:36
下一篇 06/22 17:36

相关推荐