免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3235 | 回复: 7
打印 上一主题 下一主题

求助:mysql join操作很长时间出不来的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-05 10:51 |只看该作者 |倒序浏览
20可用积分
mysql进行多次left join操作后,再left join时卡在那里,show processlist状态为sending data,两边表都有索引,重启mysql又ok,这种情况又不是每天都会出现。
这种问题怎么解决?大侠们指点下。

最佳答案

查看完整内容

联表会产生临时表,如果你处理的不好,tmp table建立在disk上,而当前磁盘io又比较吃紧的话,那您就要悠着点咯!建议:1给出查询语句2查询语句的相关表结构3explain这条语句的信息给我们:)小问题:)

评分

参与人数 1可用积分 -10 信誉积分 -20 收起 理由
yueliangdao0608 -10 -20 没有及时结贴!

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-08-05 10:51 |只看该作者
联表会产生临时表,如果你处理的不好,tmp table建立在disk上,而当前磁盘io又比较吃紧的话,那您就要悠着点咯!
建议:
1给出查询语句
2查询语句的相关表结构
3explain这条语句的信息给我们:)
小问题:)

论坛徽章:
0
3 [报告]
发表于 2008-08-05 11:05 |只看该作者
惯例:语句!!!

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
4 [报告]
发表于 2008-08-05 11:50 |只看该作者
explain sql语句

论坛徽章:
0
5 [报告]
发表于 2008-08-05 14:27 |只看该作者

回复 #1 Iamhwj 的帖子

语句:
insert into t_x3
select b.* from t_x1 as a
left join t_x2 as b using (Fmsg_id) where a.Ftid=9

mysql> explain select b.* from t_x1 as a
    -> left join db_mt.t_x2 as b using (Fmsg_id) where a.Ftid=9;
+----+-------------+-------+------+---------------+------------+---------+-----------------+-------+-------+
| id | select_type | table | type | possible_keys | key        | key_len | ref             | rows  | Extra |
+----+-------------+-------+------+---------------+------------+---------+-----------------+-------+-------+
|  1 | SIMPLE      | a     | ref  | idx_type      | idx_type   | 1       | const           | 35390 |       |
|  1 | SIMPLE      | b     | ref  | idx_msg_id    | idx_msg_id | 22      | db_x.a.Fmsg_id |     1 |       |
+----+-------------+-------+------+---------------+------------+---------+-----------------+-------+-------+

这样够了吗?表字段很多的,能不粘就不粘

论坛徽章:
0
6 [报告]
发表于 2008-08-05 14:32 |只看该作者

回复 #6 Iamhwj 的帖子

1 idx_type   是Fmsg_id和a.Ftid的索引吗?
2 table b的东西都要读出来吗 是否有text 和blob
如果你表结构觉得贴出来不方便可以给我发站内信:)
在线:)

论坛徽章:
0
7 [报告]
发表于 2008-08-05 15:36 |只看该作者
Create Table: CREATE TABLE `t_x1` (
  `Fmsg_id` varchar(20) NOT NULL,
  `Ftotal` int(11) NOT NULL,
  `Ftid` tinyint(4) NOT NULL,
  PRIMARY KEY  (`Fmsg_id`,`Ftid`),
  KEY `idx_type` (`Ftid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

t_x2太长就不贴了,里面没有什么text或blob,字符串最大长度varchar(21)
KEY `idx_msg_id` (`Fmsg_id`,`Fisretry`),


在这个语句执行之前有个left join的表的量更大一些,不知道在上个语句执行完后flush table有没有用?

论坛徽章:
0
8 [报告]
发表于 2008-10-16 15:48 |只看该作者
原帖由 Iamhwj 于 2008-8-5 15:36 发表
Create Table: CREATE TABLE `t_x1` (
  `Fmsg_id` varchar(20) NOT NULL,
  `Ftotal` int(11) NOT NULL,
  `Ftid` tinyint(4) NOT NULL,
  PRIMARY KEY  (`Fmsg_id`,`Ftid`),
  KEY `idx_type` (`Ftid`)
...

从你给出的结构来看这个join查询应该算正常
flush table的话,基本没有什么作用
建议
1:找个时间直接执行这条sql看需要多少时间,估计应该不长
2:问题应该是在磁盘io上,除去这条sql还有什么东西消耗了磁盘io
3:主键用varchar还有联合索引应该是不合适的(呵呵)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP