SQL优化案例-1
2015-10-08 17:15
344 查看
环境:
阿里云linux 4核16G
MySQL 5.6
-- 1. 原始SQL:
表数据量 :3492960
查询时间:300多秒
查询记录:14240条
-- 2.创建索引:
表数据量 :3492960
查询时间:208秒
查询记录:14240条
-- 3. 改写SQL:
SELECT
t.粒度 AS 粒度 ,
t.日期 AS 日期 ,
t.集团 AS 集团 ,
t.分区 AS 分区 ,
t.楼盘 AS 楼盘 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交量 ,NULL) )AS 商业成交量 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交面积 ,NULL) )AS 商业成交面积 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交金额 ,NULL) )AS 商业成交金额 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交量 ,NULL) )AS 住宅成交量 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交面积 ,NULL) )AS 住宅成交面积 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交金额 ,NULL) )AS 住宅成交金额 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交量 ,NULL) )AS 高层成交量 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交面积 ,NULL) )AS 高层成交面积 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交金额 ,NULL) )AS 高层成交金额 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交量 ,NULL) )AS 洋房成交量 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交面积 ,NULL) )AS 洋房成交面积 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交金额 ,NULL) )AS 洋房成交金额
FROM Out_ChanPinChengJiaoKu t
WHERE 粒度 IS NOT NULL AND
日期 IS NOT NULL AND
集团 IS NOT NULL AND
分区 IS NOT NULL AND
楼盘 IS NOT NULL
group by 粒度,日期,集团,分区,楼盘
表数据量 :3492960
查询时间:13秒
查询记录:14240条
阿里云linux 4核16G
MySQL 5.6
-- 1. 原始SQL:
select t.粒度 as 粒度 , t.日期 as 日期 , t.集团 as 集团 , t.分区 as 分区 , t.楼盘 as 楼盘 , t1.成交量 as 商业成交量 , t1.成交面积 as 商业成交面积 , t1.成交金额 as 商业成交金额 , t2.成交量 as 住宅成交量 , t2.成交面积 as 住宅成交面积 , t2.成交金额 as 住宅成交金额 , t3.成交量 as 高层成交量 , t3.成交面积 as 高层成交面积 , t3.成交金额 as 高层成交金额 , t4.成交量 as 洋房成交量 , t4.成交面积 as 洋房成交面积 , t4.成交金额 as 洋房成交金额 from ( select distinct 粒度,日期,集团,分区,楼盘 from Out_ChanPinChengJiaoKu where 粒度 is not null and 日期 is not null and 集团 is not null and 分区 is not null and 楼盘 is not null ) t LEFT JOIN ( select * -- SELECT count(1) from Out_ChanPinChengJiaoKu where flag = '产品类型' and 产品类型 = '商业' and 分区 is not null ) t1 on t.粒度 = t1.粒度 and t.日期 = t1.日期 and t.集团 = t1.集团 and t.分区 = t1.分区 and t.楼盘 = t1.楼盘 LEFT JOIN( select * -- SELECT count(1) from Out_ChanPinChengJiaoKu where flag = '产品类型' and 产品类型 = '住宅' and 分区 is not null ) t2 on t.粒度 = t2.粒度 and t.日期 = t2.日期 and t.集团 = t2.集团 and t.分区 = t2.分区 and t.楼盘 = t2.楼盘 LEFT JOIN( select * from Out_ChanPinChengJiaoKu where flag = '产品属性' and 产品属性 = '高层' and 分区 is not null ) t3 on t.粒度 = t3.粒度 and t.日期 = t3.日期 and t.集团 = t3.集团 and t.分区 = t3.分区 and t.楼盘 = t3.楼盘 LEFT JOIN( select * from Out_ChanPinChengJiaoKu where flag = '产品属性' and 产品属性 = '洋房' and 分区 is not null ) t4 on t.粒度 = t2.粒度 and t.日期 = t4.日期 and t.集团 = t4.集团 and t.分区 = t4.分区 and t.楼盘 = t4.楼盘 ;
表数据量 :3492960
查询时间:300多秒
查询记录:14240条
-- 2.创建索引:
CREATE INDEX Out_ChanPinChengJiaoKu_2 on Out_ChanPinChengJiaoKu(粒度,日期,集团,分区,楼盘);
表数据量 :3492960
查询时间:208秒
查询记录:14240条
-- 3. 改写SQL:
SELECT
t.粒度 AS 粒度 ,
t.日期 AS 日期 ,
t.集团 AS 集团 ,
t.分区 AS 分区 ,
t.楼盘 AS 楼盘 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交量 ,NULL) )AS 商业成交量 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交面积 ,NULL) )AS 商业成交面积 ,
max(IF(flag = '产品类型' AND 产品类型 = '商业' ,成交金额 ,NULL) )AS 商业成交金额 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交量 ,NULL) )AS 住宅成交量 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交面积 ,NULL) )AS 住宅成交面积 ,
max(IF(flag = '产品类型' AND 产品类型 = '住宅' ,成交金额 ,NULL) )AS 住宅成交金额 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交量 ,NULL) )AS 高层成交量 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交面积 ,NULL) )AS 高层成交面积 ,
max(IF(flag = '产品属性' AND 产品类型 = '高层' ,成交金额 ,NULL) )AS 高层成交金额 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交量 ,NULL) )AS 洋房成交量 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交面积 ,NULL) )AS 洋房成交面积 ,
max(IF(flag = '产品属性' AND 产品类型 = '洋房' ,成交金额 ,NULL) )AS 洋房成交金额
FROM Out_ChanPinChengJiaoKu t
WHERE 粒度 IS NOT NULL AND
日期 IS NOT NULL AND
集团 IS NOT NULL AND
分区 IS NOT NULL AND
楼盘 IS NOT NULL
group by 粒度,日期,集团,分区,楼盘
表数据量 :3492960
查询时间:13秒
查询记录:14240条
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复