首页新闻找找看学习计划

sql update问题,不懂啊

0
悬赏园豆:10 [待解决问题]

update 表A,(子查询)as 表B

set 表A.column = "1";

where 表A.column2 = 表B.column2;

 

就是子查询的速度也还蛮快,如果是

select 表A.column

from 表A,(子查询)as 表B

where 表A.column2 = 表B.column2;

也能很快查出来,为什么一到用上面的update操作的时候就非常非常慢

(PS:A表中有上万条数据,但是表B我是测试用的,就只有一条数据,也就是找A表一万条数据中和表B的一条数据相同的内容,然后改掉表A的这条数据记录,竟然用了2000多秒!!!)

问题补充:
UPDATE test.playercache as a,
(select tb1.name,tb1.vipLv+tb2.vipLv as vipLv
from (select        name,substring_index(substring_index(jsonField,'\"vipLv\":\"',-1),'\"',1) as vipLv 
  FROM test.`playerCache` WHERE substring_index(substring_index(jsonField,'\"vipLv\":\"',-1),'\"',1) > 1) as tb1,
     (select name,substring_index(substring_index(jsonField,'\"vipLv\":\"',-1),'\"',1) as vipLv 
      FROM test2.playercache WHERE substring_index(substring_index(jsonField,'\"vipLv\":\"',-1),'\"',1) > 1) as tb2
WHERE tb1.name = tb2.name) as temp
SET a.jsonField = CONCAT_WS(CONCAT('\"vipLv\":"',temp.vipLv),SUBSTRING_INDEX(jsonField,'\"vipLv\":\"',1),SUBSTRING_INDEX(jsonField,CONCAT(SUBSTRING_INDEX(jsonField,'\"vipLv\":\"',1),'\"vipLv\":\"',SUBSTRING_INDEX(jsonField,'\"vipLv\":\"',-1)+0),-1))
WHERE a.`name` = temp.`name`;

就是截取出表test.playercache和test2.playercache的jsonfield字段中的vipLv对应的值,相加,然后放回去test表中,即修改了test表中的vipLv了



最新:105秒了,没做什么修改啊,好奇怪
还是好慢,不应该啊,子查询单独查只用0.333秒,这里面肯定哪里不对
YAN_HUAXIANGMO的主页 YAN_HUAXIANGMO | 初学一级 | 园豆:189
提问于:2018-06-22 10:24
< >
分享
所有回答(4)
0

2000 多秒?接近1小时? 这是8086服务器么?

爱编程的大叔 | 园豆:29764 (高人七级) | 2018-06-22 10:34

我也感觉没道理啊,子查询是0.333秒,上面的select查询是用了27秒,然后最上面哪个update用了2300秒,update有个效率说法吗

支持(0) 反对(0) YAN_HUAXIANGMO | 园豆:189 (初学一级) | 2018-06-22 10:56

@YAN_HUAXIANGMO: 一点不奇怪的,如果你那个表里面做了啥见不得人的触发器,就是几天也是正常的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:29764 (高人七级) | 2018-06-22 11:25

@爱编程的大叔: 我代码贴上了,就是这个子查询,换成是个简单查询很快更新了,但是要是换上我上面的子查询,就是2000多秒那种情况了,但是哪个子查询单独查的话又只有0.333秒

支持(0) 反对(0) YAN_HUAXIANGMO | 园豆:189 (初学一级) | 2018-06-22 11:34
0

鬼鬼,这效率也太恐怖了,sql贴出来看看

小光 | 园豆:1825 (小虾三级) | 2018-06-22 11:05

我发现了,好像,是加上了子查询,它的查询顺序就发生了变化了,简单的子查询很快,复杂的子查询就变了,难道不是先子查询查出表来,再到where条件筛选然后set更新吗

支持(0) 反对(0) YAN_HUAXIANGMO | 园豆:189 (初学一级) | 2018-06-22 11:27

@YAN_HUAXIANGMO: SQL嵌套会影响效率,拆分开尝试一下

支持(0) 反对(0) 小光 | 园豆:1825 (小虾三级) | 2018-06-22 12:02

@小光: 怎么拆分?我的结构就是

update 表A,(子查询)as 表B

set 表A.column = "1";

where 表A.column2 = 表B.column2;

这样,子查询要怎么放

支持(0) 反对(0) YAN_HUAXIANGMO | 园豆:189 (初学一级) | 2018-06-22 12:08
0

看执行计划嘛,这样基本就知道鬼在哪儿了。

西漠以西 | 园豆:1670 (小虾三级) | 2018-06-22 11:57

我的mysql是5.7的,鬼在哪

id      select_type  table      type      rows    filtered  Extra

1   UPDATE    a      all    9434             100    

1   SIMPLE  playercache   all      9434              10    Using where

1   SIMPLE  playercache   all           10998            100    Using where

 

支持(0) 反对(0) YAN_HUAXIANGMO | 园豆:189 (初学一级) | 2018-06-22 14:22

@YAN_HUAXIANGMO: 

select * ,你要的新值你自己拼  from test left join test2 on test.name = test2.name

 

先把这个写完整,跑跑看要几秒

性能达到要求了再改成update

支持(0) 反对(0) 西漠以西 | 园豆:1670 (小虾三级) | 2018-06-22 15:55
0

你这是sqlserver。

只能分享执行计划,看看能否改写 或用下临时表或内存表(如果子查询的数据量不大的话)解决。

jinzhenshui | 园豆:299 (菜鸟二级) | 2018-07-04 16:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册