MYSQL GroupBY -JOIN的优化

tianlianchao1982 2012-07-05 03:00:12
一个表groupby 后还有两万多条 和另一个表 (3000条)join ,怎么能让它速度好点呢 现在是4秒多才能查出来

相关语句如下:




#set @shop_id = 45;
#set @product_code = '22230044';
#set @season_id = 586 ;
#set @erp_category_id = 264;
#set @tag_info = '热卖';
set @start_on_sale_date = '1900-1-1';
set @end_on_sale_date = '2050-1-1';
set @start_day = '2012-6-21';
set @end_day = '2012-6-27';
set @min_sale_number =-2147000000;
set @max_sale_number =2147000000;
set @min_can_use_stock =-2147000000;
set @max_can_use_stock =2147000000;
set @warehouse_id = 1;

EXPLAIN
SELECT count(1)
/*tb_ppi.product_code as 款号
,tb_ppi.product_name as 商品名称
#,tb_ppi.image as 图片
,tb_ppi.season_name as 季节
,tb_ppi.erp_category_name as 品类
,tb_pti.product_tag_manual as 标签
,tb_posi.on_sale_date as 上架日期
,tb_apsdc.shop_name as 店铺名称
,tb_apsdc.cost_price as 成本价
,tb_apsdc.network_price as 网络价
,tb_apsdc.sale_money as 销售金额
,tb_apsdc.sale_price as 实际成交均价
,tb_apsdc.sale_number as 实际成交件数
,tb_apsdc.sale_number / (DATEDIFF(@end_day,@start_day)+1) as 日均销售件数
,tb_apsdc.sale_price / tb_apsdc.cost_price as 实际倍率
,tb_apsdc.sale_price / tb_apsdc.network_price as 平均折扣率
,tb_lzisr.ipv as 浏览量
,tb_lzisr.iuv as 访客数
,tb_lzisr.alipay_winner_num as 成交顾客数
,tb_lzisr.roc as 转化率
,tb_spsi.warehouse_name as 仓库名称
,tb_spsi.quality_stock as 库存数量
,tb_spsi.can_use_stock as 可用减
,tb_sps.not_in_wh_number as 在途量
,(tb_spsi.can_use_stock + tb_sps.not_in_wh_number ) as 可用量
,(((tb_spsi.can_use_stock) /(tb_apsdc.sale_number / (DATEDIFF(@end_day,@start_day)+1) * 0.8))+3) as 库存消化天数
,(((tb_spsi.can_use_stock + tb_sps.not_in_wh_number ) /(tb_apsdc.sale_number / (DATEDIFF(@end_day,@start_day)+1) * 0.8))+3) as 可用量消化天数
,date_add(curdate(),INTERVAL ((tb_spsi.can_use_stock /(tb_apsdc.sale_number / (DATEDIFF(@end_day,@start_day)+1) * 0.8))+3) day ) as 消化完成日期
*/
FROM `product_product_info` as tb_ppi
join (
select product_id,shop_id
,shop_name

,avg(cost_price) as cost_price
,avg(network_price) as network_price
,avg(sale_price) as sale_price
,sum(sale_number) as sale_number
,sum(sale_money) as sale_money
from `analysis_product_sale_day_count`
where ( (analysis_date between @start_day and @end_day)
and ( shop_id in(34,35,45,52))# = 34 or shop_id = 35 or shop_id = 45 or shop_id = 52)
#and shop_id = @shop_id
#and product_code=@product_code
)
group by product_id,shop_id
,shop_name

#having (
# sum(sale_number) between @min_sale_number and @max_sale_number
# )
) as tb_apsdc
on (
tb_ppi.product_id=tb_apsdc.product_id
#and tb_ppi.product_code = @product_code
#and tb_ppi.season_id = @season_id
#and tb_ppi.erp_category_id = @erp_category_id
#and tb_apsdc.shop_id = @shop_id
)

请问如何优化?
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rotel-刘志东 2012-07-05
  • 打赏
  • 举报
回复
explain select....执行计划是怎样的。
show index from tb...
tianlianchao1982 2012-07-05
  • 打赏
  • 举报
回复
show indexes from `product_product_info`;

product_product_info 0 PRIMARY 1 product_id A 5721 BTREE
product_product_info 1 product_code 1 product_code A 5721 BTREE


show indexes from `analysis_product_sale_day_count`;
analysis_product_sale_day_count 0 PRIMARY 1 sku_id A 17688 BTREE
analysis_product_sale_day_count 0 PRIMARY 2 shop_id A 53066 BTREE
analysis_product_sale_day_count 0 PRIMARY 3 analysis_date A 212266 BTREE
analysis_product_sale_day_count 1 idx_analysis_date 1 analysis_date A 96 BTREE
analysis_product_sale_day_count 1 idx_shop_id 1 shop_id A 6 BTREE
analysis_product_sale_day_count 1 idx_product_code 1 product_code A 4005 YES BTREE
analysis_product_sale_day_count 1 idx_sku_id 1 sku_id A 26533 BTREE
analysis_product_sale_day_count 1 xx 1 shop_id A 14 BTREE
analysis_product_sale_day_count 1 xx 2 shop_name A 14 YES BTREE
analysis_product_sale_day_count 1 xx 3 product_code A 30323 YES BTREE
analysis_product_sale_day_count 1 idx_product_sale 1 product_id A 5896 YES BTREE
analysis_product_sale_day_count 1 idx_product_sale 2 shop_id A 17688 BTREE
analysis_product_sale_day_count 1 idx_product_sale 3 shop_name A 17688 YES BTREE
analysis_product_sale_day_count 1 idx_product_id 1 product_id A 2122 YES BTREE


EXPLAIN:


1 PRIMARY <derived2> ALL 1458
1 PRIMARY tb_ppi eq_ref PRIMARY PRIMARY 4 tb_apsdc.product_id 1 Using index
2 DERIVED analysis_product_sale_day_count range idx_analysis_date,idx_shop_id,xx idx_analysis_date 3 30042 Using where; Using temporary; Using filesort
ACMAIN_CHM 2012-07-05
  • 打赏
  • 举报
回复
explain select ...
show index from ,,,,

贴出来以供分析。
  大家好,我是录制课程的老师,课程已经上线课堂,欢迎大家试听,感谢同学们的支持。在你们的学习中我会全力助你提升MySQL技能,助你冲击更高年薪。支持课程答疑,支持一对一答疑服务,由课程老师直接回答。    MySQL凭借着它不错的性能、不错的稳定性、数据的安全性常年稳居行业老二宝座。    越来越多的DBA和后端同学在工作中少不了和MySQL打交道,也经常会产生这样的疑问:    为什么我写的sql语句性能这么低?  为什么明明我建了索引却没有用到索引?  为什么突然我的数据就成了乱码?  为什么我备份的文件在主库恢复,数据无法同步到从库?  为什么我的数据库数据不多,却占了很多的空间?  生产中我应该选择哪种隔离级别?  生产中都在使用innodb存储引擎,我却对它一无所知?  我应该怎么规划缓冲池才能让数据库性能更高?  为什么我做表数据迁移这么慢?  为什么我写的sql会造成那么多的锁冲突、死锁?  为什么我不能将数据恢复到任意时间点?  为什么我不能解决公司主从复制架构中的故障?  吧啦吧啦一大堆问题……    在面试中MySQL的一些知识更成为躲不过的问题,比如b+tree索引、MVCC、隔离级别的实现、锁的使用,主从复制,MySQL性能优化、事务两阶段提交等等都成为了面试考题重灾区。    我的课程就是从实际工作来,从问题出发,带着问题来学习MySQL,想解决问题就要学习新的知识,大家跟紧老司机,MySQL的面纱就会慢慢摘下。

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧