三个表关联
select 
sum(XXX)
from a
left join b on a.id1=b.id1 and a.id2=b.id2
left join c on c.id1=b.id1
where a.date between '' and '' (时间范围为1个月) and a.org in (1,2,3,4,5,6,7,8,9,10) and b.log=0
group by
b.id3,b.id4,b.id5,b.id6,b.id7,b.id8  (分组字段为6个)查询时间为:5.658其中b表中数据量最大,此时间范围内为392571条数据,整张表数据量为2989801条数据。
explain 后id   select_type  tabel    type     rows            extra  
1     SIMPLE       a             rang     45113        Using where; Using index; Using temporary; Using filesort
1     SIMPLE       b             ref          8                Using where
1     SIMPLE       c             eq_ref   4                Using indexshow profile block io,cpu for query 449;
status                              duration           cpu_user       cpu_system   Block_ops_in   Block_ops_out
Copying to tmp table  4.831741          4.890625      0             null                     null分组是必须的,需要根据这个分组去确定返回结果集内的很多数据。而且这个6个字段是分组的依据,也没有其他方式去处理。
即便去掉分组直接查询剩余的部分,时间也要3秒以上。mysql 版本:5.5
temp_table_size为35M,max_heap_table_size这个在配置文件里没有找到,就没有对这个做任何变动。
我在数据量比这个小的库上把temp_table_size的值调到了50M和100M,并没有明显的提升。希望大神们帮着提一些优化的建议。  PS:
where后面的条件是根据参数来决定的,日期和org 肯定会有,但是时间范围不定,org in的内容也是不确定的。 已经按照org做了表分区了,单查一个org,一个月的数据0.704s就能出结果。

解决方案 »

  1.   

    我大csdn没人帮助我啊
      

  2.   

    a表用到了临时表和排序。
    group by会隐含一个order by排序语法
      

  3.   

    表的索引结构呢? 检索最终的数据量是多少呢(没有group by的 )
    三张表的总数据量 ?
      

  4.   

    a b c表索引情况,以及关联字段在表中是否有重复?
      

  5.   

    我遇到很多开发的同事写sql,都使用到了关联查询,但是都不清楚到底是否需要使用外关联还是内关联。同样,你也需要确定是否需要使用左关联查询,这个其实很重要。是否是业务需要使用左连接。