sql query如下:EXPLAIN SELECT t1.szs_guige,SUM(t1.szs_shuliang) FROM szs_ck_ruku_items t1,szs_ck_ruku t2 WHERE t1.szs_rukubianhao = t2.szs_rukubianhao  AND t1.szs_kuhao = t2.szs_kuhao AND t1.szs_kuwei = t2.szs_kuwei AND t2.szs_date>'2010-10-23' GROUP BY t1.szs_guige ORDER BY null在sqlyog里面结果如下: 
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 range PRIMARY,date date 3 \N 177 Using where; Using index; Using temporary1 SIMPLE t1 ref PRIMARY PRIMARY 32 szs_jihuadan.t2.szs_rukubianhao 4 表结构如下:
CREATE TABLE `szs_ck_ruku` (
  `szs_rukubianhao` varchar(10) NOT NULL,
  `szs_kuhao` varchar(10) NOT NULL,
  `szs_kuwei` varchar(10) NOT NULL,
  `szs_xianghao` varchar(4) NOT NULL,
  `szs_caozuoyuan` varchar(10) NOT NULL,
  `szs_date` date NOT NULL,
  PRIMARY KEY  (`szs_rukubianhao`,`szs_kuhao`,`szs_kuwei`),
  KEY `date` (`szs_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8CREATE TABLE `szs_ck_ruku_items` (
  `szs_rukubianhao` varchar(10) NOT NULL,
  `szs_kuhao` varchar(10) NOT NULL,
  `szs_kuwei` varchar(10) NOT NULL,
  `szs_shengchanhao` varchar(50) NOT NULL,
  `szs_guige` varchar(100) NOT NULL,
  `szs_tuhao` varchar(100) NOT NULL,
  `szs_shuliang` int(8) NOT NULL,
  `szs_beizhu` text NOT NULL,
  PRIMARY KEY  (`szs_rukubianhao`,`szs_kuhao`,`szs_kuwei`,`szs_shengchanhao`,`szs_guige`,`szs_tuhao`),
  KEY `GG` (`szs_guige`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8是不是用到group by ,就会启用临时表?

解决方案 »

  1.   


    修改my.cnf,增大sort_buffer_size大小,这个参数就是为了排序分组order by group by的时候,存储数据的,一般,数据库服务器内存在8G的话,可以将这个值设置为16M。
      

  2.   

    在szs_ck_ruku_items 表上建立:
    create index asdasd on szs_ck_ruku_items(szs_guige,szs_shuliang)
    试下:EXPLAIN SELECT t1.szs_guige,SUM(t1.szs_shuliang) FROM 
    szs_ck_ruku_items t1 force index(asdasd),szs_ck_ruku t2 WHERE t1.szs_rukubianhao = t2.szs_rukubianhao AND t1.szs_kuhao = t2.szs_kuhao AND t1.szs_kuwei = t2.szs_kuwei 
    AND t2.szs_date>'2010-10-23' 
    GROUP BY t1.szs_guige ORDER BY null什么情况?要是真不行的话;当无法使用索引完成GROUP BY 的时候,由于要使用到临时表且需要filesort,所以我们必须
    要有足够的sort_buffer_size 来供MySQL 排序的时候使用,而且尽量不要进行大结果集的GROUP
    BY 操作,因为如果超出系统设置的临时表大小的时候会出现将临时表数据copy 到磁盘上面再进行
    操作,这时候的排序分组操作性能将是成数量级的下降;
      

  3.   

    贴出
     show index from ....另外建议你直接用MYSQL的命令行工具贴出其结果,方便阅读。
      

  4.   

    很奇怪,今天早上我开机重新用相同的sql语句explain一下,using temporary居然没有了