原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消耗时间大幅下降。

sending data mysql_MySQL查询中Sending data占用大量时间的问题处理相关推荐

  1. python中的data解释_python中的data解释_python unicodedata用法

    UCD是Unicode字符数据库(Unicode Character DataBase)的缩写. UCD由一些描述Unicode字符属性和内部关系的纯文本或html文件组成. UCD中的文本文件大都是 ...

  2. data在python_python中的data[:, :-1]和data[:, -1]什么意思?

    问题:在用python3使用knn.train(trainData,responses)的时候,可能会产生错误:TypeError:onlysize-1arrayscanbeconvertedtoPy ...

  3. java精准查询mysql时间_在mysql查询中查找与指定日期时间最接近的日期时间

    我试图在mysql数据库中找到一个datetime值,它与我指定的日期时间最接近,我遇到了一些麻烦 . 以下伪代码是我想要实现的: SELECT one FROM table WHERE dateti ...

  4. MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  5. 如何使用Redis Data Reveal(rdr)查看redis中每个key占用的内存大小

    如何使用Redis Data Reveal(rdr)查看redis中每个key占用的内存大小 一.为什么要查看redis中每个key的占用 二.怎么查看redis中每个key的占用 一.为什么要查看r ...

  6. load导入txt文件到mysql_mysql导入数据load data infile用法(将txt文件中的数据导入表中)...

    我们常常导入数据!mysql有一个高效导入方法,那就是load data infile 下面来看案例说明 基本语法: load data  [low_priority] [local] infile ...

  7. 查询mysql数据库表占用空间大小_查看 MySQL 数据库中每个表占用的空间大小-阿里云开发者社区...

    如果想知道MySQL数据库中每个表占用的空间.表记录的行数的话,可以打开MySQL的 information_schema 数据库.在该库中有一个 TABLES 表,这个表主要字段分别是: TABLE ...

  8. Oracle 11g Data Guard环境中的归档管理

    在11g里面,随着ASM.RAC.Data Guard(包括Active Data Guard)的成熟,使用RAC+ASM+Data Guard越来越成为一种可靠的.维护简单.稳定的高可用性和容灾保护 ...

  9. eclipse工具连接mysql_eclipse工具中使用Data Source Explorer连接数据库(MySQL)

    1.进入Eclipse工具,打开Data Source Explorer.Window==>Show View==>Data Source Explorer(注:如果找不到请选择Other ...

最新文章

  1. linux上安装pycharm
  2. Linux高效数据统计命令wc
  3. php简单网站源码包含数组_PHP 数组
  4. [luogu3676]小清新数据结构题
  5. 《UNIX网络编程 卷2》读书笔记(一)
  6. 【软件测试】你的简历出现这些问题?没人要也是有原因的
  7. Andorid音频工具tinymix,tinyplay,tinycap使用
  8. 25.卷1(套接字联网API)--- 信号驱动式IO
  9. Win7开机提示任务管理器已停止工作解决方法
  10. 【程序员必备】七夕表白攻略:教你用代码轻松打动她的内心!
  11. wsl 1 ubuntu 安装图像化界面
  12. 如何利用少数粉丝,实现短时间流量倍增?
  13. Elastic 与 AWS 和解、英伟达收购 ARM 失败、英特尔加入RISC-V 组织|开源月报 Vol. 03...
  14. 投影坐标系的shp数据,如何获取到它地理坐标系下的经纬度坐标
  15. 支付宝签名php,支付宝支付之php后台签名实现方法
  16. word2007中如何删除脚注尾注
  17. 八、HTML常用标签
  18. 树莓派3B使用tensorflow的classify_image进行物体识别
  19. Java网页编程与设计——javascript语言
  20. PHP 环境搭建(win7+php5.6+apache或nginx)

热门文章

  1. TCMalloc:线程缓存Malloc以及tcmalloc与ptmalloc性能对比
  2. 关系型数据库(Relational Database)与非关系型数据库(NoSQL)的区别:(MySQL,Redis,Memcache,MongoDB)
  3. Linux环境编程:fork系统调用及其陷阱 - 内存复用,文件不复用
  4. C语言单元测试框架-cmocka示例
  5. 2019.02.10 17:49
  6. CUDA全局变量(__device__)的初始化与使用:cudaMemoryToSymbol、cudaMemoryFromSymbol、cudaGetSymbolAddress
  7. GTK实现:俄罗斯方块小游戏源代码(RussiaCube.c)
  8. redis 管理工具_「程序猿同事的分享」redis cluster管理工具redis-trib.rb详解
  9. 闭包 python_根据面试题谈谈 Python 闭包
  10. python爬虫怎么写多线程_Python爬虫【第3篇】【多线程】