千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了MySQL查询中Sending data占用大量时间怎么办,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。原SQL执行
千家信息网最后更新 2026年11月02日MySQL查询中Sending data占用大量时间怎么办

这篇文章主要介绍了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

以上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

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`);

执行计划:

消耗时间:

加第二条索引: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占用大量时间怎么办"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

索引 时间 数据 查询 篇文章 消耗 字段 怎么办 条件 状态 三条 最长 上将 价值 关键 兴趣 原因 同时 名称 含义 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 美国互联网科技巨头监管 互联网最新的科技有限公司 互联网科技logo 甘肃拓世互联网科技有限公司 四个字互联网科技公司取名 新华互联网科技校企合作 互联网科技创新企业排名 天速互联网络科技有限公司 中国科技互联网公司收入 北京华百购互联网科技有限公司 现代互联网科技股 江阴互联网智能科技产品进口 国大互联网教育科技有限公司工作 用友工业互联网科技发展 互联网第三次科技革命特征 张召忠谈中国互联网科技 互联网与数字科技关系 艺电能源互联网科技有限公司招聘 互联网领先科技成果宣传视频 互联网大会出现的黑科技 互联网科技保险 科技与互联网哪个更好 互联网科技与管理 河南猎农互联网科技有限公司 互联网科技如何创业 高科技互联网套路 电子商务与互联网科技的关系 互联网科技包装股 银川新华互联网科技学校是国营吗 网互联网络科技
0