求助,如何去除using temporary?

michael3832628 2011-01-19 10:13:56
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=utf8

CREATE 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 ,就会启用临时表?
...全文
511 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rucypli 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 michael3832628 的回复:]
很奇怪,今天早上我开机重新用相同的sql语句explain一下,using temporary居然没有了
[/Quote]
正常 并不是每次的执行计划都是一样的
michael3832628 2011-01-20
  • 打赏
  • 举报
回复
很奇怪,今天早上我开机重新用相同的sql语句explain一下,using temporary居然没有了
ACMAIN_CHM 2011-01-19
  • 打赏
  • 举报
回复
贴出
show index from ....

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

小小小小周 2011-01-19
  • 打赏
  • 举报
回复
在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 到磁盘上面再进行
操作,这时候的排序分组操作性能将是成数量级的下降;
mysqldbd 2011-01-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 michael3832628 的回复:]
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……
[/Quote]

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

56,679

社区成员

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

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