-- 业务每周查询一份报表,每次执行sql磁盘直接由49%涨到%93,执行了几次发现是sql用到了磁盘临时表,对sql进行了改写
-- 原查询sql:

SELECTCODE,NAME,num,GROUP_CONCAT(product_id) AS product_ids,GROUP_CONCAT(product_name) AS product_names
FROM(SELECTCOUNT(DISTINCT (psn.Psnid)) AS num,cus.CODE,cus.`name`,od.product_id,pr.NAME AS product_nameFROMmid_psn_copy AS psnJOIN customer AS cus ON cus.CODE = psn.PkCorpJOIN product_order_rel AS od ON od.customer_code = cus.CODEJOIN product AS pr ON pr.id = od.product_idWHEREpsn.`Status` = 1 AND od.`status` = 1GROUP BY od.customer_code , od.product_id) AS tt
GROUP BY CODE;-- 69 rows in set, 1 warning (34.54 sec)

-- 原执行计划

+----+-------------+------------+--------+---------------------------------------------------------------------------+------------------------------+---------+------------------------+--------+----------------------------------------------+
| id | select_type | table      | type   | possible_keys                                                             | key                          | key_len | ref                    | rows   | Extra                                        |
+----+-------------+------------+--------+---------------------------------------------------------------------------+------------------------------+---------+------------------------+--------+----------------------------------------------+
|  1 | PRIMARY     | <derived2> | ALL    | NULL                                                                      | NULL                         | NULL    | NULL                   | 325296 | Using filesort                               |
|  2 | DERIVED     | cus        | index  | idx_custom_code,idx_code_name                                             | idx_code_name                | 274     | NULL                   |    251 | Using index; Using temporary; Using filesort |
|  2 | DERIVED     | psn        | ref    | idx_psn_pkcorp,idx_psn_Status,idx_pkcrop_status                           | idx_pkcrop_status            | 157     | gmcloud.cus.code,const |     36 | Using index condition                        |
|  2 | DERIVED     | od         | ref    | idx_customer_code_pdid_status,idx_product_id,idx_customer_code_product_id | idx_customer_code_product_id | 123     | gmcloud.cus.code       |     36 | Using where; Using index                     |
|  2 | DERIVED     | pr         | eq_ref | PRIMARY                                                                   | PRIMARY                      | 8       | gmcloud.od.product_id  |      1 | NULL                                         |
+----+-------------+------------+--------+---------------------------------------------------------------------------+------------------------------+---------+------------------------+--------+----------------------------------------------+ 

-- 第一次优化,去掉外层嵌套,把外层条件融合到当前sql
-- 加联合索引
-- alter table customer add key idx_code_name (`code`,`name`)
-- alter table product_order_rel add key idx_customer_code_pdid_status (`customer_code`,`product_id`,`status`)

SELECTCOUNT(DISTINCT (psn.Psnid)) AS num,cus.CODE,cus.`name`,GROUP_CONCAT(od.product_id) AS product_ids,GROUP_CONCAT(pr.NAME) AS product_namesFROMmid_psn_copy AS psnJOIN customer AS cus ON cus.CODE = psn.PkCorpJOIN product_order_rel AS od ON od.customer_code = cus.CODEJOIN product AS pr ON pr.id = od.product_idWHEREpsn.`Status` = 1 AND od.`status` = 1GROUP BY cus.CODE, od.customer_code , od.product_id;

-- 查看执行计划,虽然没有了DERIVED、derived2,但是看到还有Using temporary; Using filesort存在

+----+-------------+-------+--------+-------------------------------+-------------------------------+---------+-----------------------+------+----------------------------------------------+
| id | select_type | table | type   | possible_keys                 | key                           | key_len | ref                   | rows | Extra                                        |
+----+-------------+-------+--------+-------------------------------+-------------------------------+---------+-----------------------+------+----------------------------------------------+
|  1 | SIMPLE      | cus   | index  | idx_custom_code,idx_code_name | idx_code_name                 | 274     | NULL                  |  251 | Using index; Using temporary; Using filesort |
|  1 | SIMPLE      | psn   | ref    | idx_psn_pkcorp,idx_psn_Status | idx_psn_pkcorp                | 152     | gmcloud.cus.code      |   69 | Using index condition; Using where           |
|  1 | SIMPLE      | od    | ref    | idx_customer_code_pdid_status | idx_customer_code_pdid_status | 123     | gmcloud.cus.code      |   36 | Using where; Using index                     |
|  1 | SIMPLE      | pr    | eq_ref | PRIMARY                       | PRIMARY                       | 8       | gmcloud.od.product_id |    1 | NULL                                         |
+----+-------------+-------+--------+-------------------------------+-------------------------------+---------+-----------------------+------+----------------------------------------------+ 

-- 第二次优化,把group by 后边的od.customer_code , od.product_id去掉,在前边group_concat加上distinct    
-- 在where条件和group by条件都加了联合索引
-- alter table customer add key idx_code_name (`code`,`name`)
-- alter table mid_psn_copy add key idx_pkcrop_status` (`PkCorp`,`Status`)
-- alter table product_order_rel add key idx_customer_code_product_id (`customer_code`,`product_id`,`status`)
-- 优化完的sql:

SELECTCOUNT(DISTINCT (psn.Psnid)) AS num,cus.CODE,cus.`name`,GROUP_CONCAT(distinct od.product_id) AS product_ids,GROUP_CONCAT(distinct pr.NAME) AS product_namesFROMcustomer AS cusJOIN product_order_rel AS od ON od.customer_code = cus.CODEJOIN mid_psn_copy AS psn ON  psn.PkCorp = cus.CODEJOIN product AS pr ON pr.id = od.product_idWHEREpsn.`Status` = 1 AND od.`status` = 1GROUP BY cus.CODE;

-- 再次查看执行计划

+----+-------------+-------+--------+-------------------------------------------------+------------------------------+---------+------------------------+------+--------------------------+
| id | select_type | table | type   | possible_keys                                   | key                          | key_len | ref                    | rows | Extra                    |
+----+-------------+-------+--------+-------------------------------------------------+------------------------------+---------+------------------------+------+--------------------------+
|  1 | SIMPLE      | cus   | index  | idx_code_name,idx_code                          | idx_code_name                | 274     | NULL                   |  251 | Using index              |
|  1 | SIMPLE      | psn   | ref    | idx_psn_pkcorp,idx_psn_Status,idx_pkcrop_status | idx_pkcrop_status            | 157     | gmcloud.cus.code,const |   36 | Using index condition    |
|  1 | SIMPLE      | od    | ref    | idx_product_id,idx_customer_code_product_id     | idx_customer_code_product_id | 123     | gmcloud.cus.code       |   36 | Using where; Using index |
|  1 | SIMPLE      | pr    | eq_ref | PRIMARY                                         | PRIMARY                      | 8       | gmcloud.od.product_id  |    1 | NULL                     |
+----+-------------+-------+--------+-------------------------------------------------+------------------------------+---------+------------------------+------+--------------------------+

-- 调整下表头顺序

SELECTcus.CODE,cus.`name`,COUNT(DISTINCT (psn.Psnid)) AS num,GROUP_CONCAT(DISTINCT od.product_id) AS product_ids,GROUP_CONCAT(DISTINCT pr.NAME) AS product_names
FROMcustomer AS cusJOINproduct_order_rel AS od ON od.customer_code = cus.CODEJOINmid_psn_copy AS psn ON psn.PkCorp = cus.CODEJOINproduct AS pr ON pr.id = od.product_id
WHEREpsn.`Status` = 1 AND od.`status` = 1
GROUP BY cus.CODE;
-- 69 rows in set (6.95 sec)

-- 执行sql后,查看临时表状态没有增加了
mysql> show status like '%tmp%';

+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
| Created_tmp_files       | 619   |
| Created_tmp_tables      | 3     |
+-------------------------+-------+

优化待续。。。

mysql derived2、Using temporary 和 Using filesort 优化记录相关推荐

  1. mysql优化-oder by产生的Using temporary与Using filesort问题解决

    下面的mysql代码因为order by的原因,出现了Using temporary与Using filesort,优化前代码如下 SELECT DISTINCT( tm.task_no ) task ...

  2. mysql using temporary_执行计划中Using filesort,Using temporary相关语句的优化解决_MySQL

    bitsCN.com 昨天听开发人员提到,相关的彩票网页当中一个页面刷新的很慢,特别是在提取数据的时候, 今天早上一到,便去找开发人员要去相关的也没进行浏览,窥探哪些数据出现了问题,开发人员 使用PH ...

  3. MySQL 的索引是什么?怎么优化?

    转载自  MySQL 的索引是什么?怎么优化? 摘要: 索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的 ...

  4. 我的MYSQL学习心得(十六) 优化

    原文:我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看 ...

  5. mybatis与mysql调优_MySQL + mybatis的SQL优化方案

    sql优化方案: 1.添加索引,在条件参数,关联参数上建立参数, 2.字段优化,需要什么字段查什么字段 3.模糊查询尽量使用: select * from tableName a where a.na ...

  6. 用MySql的查询分析语法explain来优化查询和索引

    http://hi.baidu.com/wtnzone/item/beb83840a4971af4dd0f6c77 数据库最常见的操作就是查询了,我们经常要用"SELECT"语法对 ...

  7. MySQL 的索引、执行计划、优化器算法

    SQL处理流程 INDEX 索引 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现: 索引相当于一本书的目录,可以优化查询. 优点: 索引 ...

  8. MySQL的批量更新和批量新增优化

    MySQL的批量更新和批量插入优化 如果需要批量插入和批量更新操作就需要进行sql 的优化,否则近30万条数据的插入或更新就会耗费几分钟甚至更多的时间, 此文仅批量插入和批量更新的几种优化. 批量插入 ...

  9. Mysql中慢SQL的分析与优化

    为何对慢SQL进行治理 从数据库角度看:每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短.假设总资源是100,有一条慢SQL占用了30的资源共计1分钟.那么在这1分钟 ...

最新文章

  1. [置顶]一步步构建大型网站架构
  2. ​多视图立体视觉: CVPR 2019 与 AAAI 2020 上的ACMH、ACMM及ACMP算法介绍
  3. 《研磨设计模式》chap8 生成器模式Builder
  4. 【QGIS入门实战精品教程】9.1:QGIS构建泰森多边形(Thiessen Polygon)实例精解
  5. 华为2019年校招(20届实习)机考题python版解答与思路(2019-3-13软件题)
  6. JS计算本周一和本周五的日期
  7. Mybatis01(结果集封装)
  8. STM32中断与事件
  9. mysql解压安装如何登录_如何安装windows解压版MySQL及开启报错
  10. 点亮两个发光管用c语言编辑,第二个试验:用单片机点亮一个闪烁的发光管-----51单片机汇编语言试验教程 - CSDN博客...
  11. lisp的vla函数画矩形_利用Lisp做Tin三角网建模(源代码)
  12. 2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述(2)——Encoder stage
  13. CentOS-6.3安装配置Tomcat-7
  14. win7下cmd乱码
  15. 股市投资时,寻找低市盈率标的
  16. 腾讯视频Node.js服务是如何支撑国庆阅兵直播高并发的?
  17. 高考首日,为梦想加油!
  18. C语言学习2:Hello World!详解
  19. JavaScript实时获取现货黄金,白银,美元指数价格代码
  20. java 转换pdf页面尺寸_Java PDF页面设置——页面大小、页边距、纸张方向、页面旋转...

热门文章

  1. SuperMap iMobile for Android开发入门(iMobile 10i + AS 3.6)
  2. Java 17 新特性尝鲜
  3. 随机访问MAC协议 知识梳理(ALOHA,CSMA,CSMA/CD,CSMA/CA)
  4. python如何对excel批量加密_批量解除excel密码保护 可多个密码,python
  5. 浅谈珠宝品牌推广的策略和方法
  6. 如何修改ant design mobile或者其他UI组件的全局样式
  7. 女性服务社群产品设计
  8. 【2017年第2期】开发商业智能应用 小心大数据“陷阱”
  9. ffmpeg amovie movie 无法读取文件错误 找不到C、D、E、F
  10. 女性必知的健康正确的洗澡方式