您的位置:首页 > 数据库

SQL优化案例-1

2015-10-08 17:15 344 查看
环境:

阿里云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条
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SQL优化 案例 MySQL