SQL优化案例-1



环境:
阿里云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条



猜你喜欢

转载自blog.csdn.net/zhouhaiqing0905/article/details/48975015