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秒,这里面肯定哪里不对
2000 多秒?接近1小时? 这是8086服务器么?
我也感觉没道理啊,子查询是0.333秒,上面的select查询是用了27秒,然后最上面哪个update用了2300秒,update有个效率说法吗
@YAN_HUAXIANGMO: 一点不奇怪的,如果你那个表里面做了啥见不得人的触发器,就是几天也是正常的。
@爱编程的大叔: 我代码贴上了,就是这个子查询,换成是个简单查询很快更新了,但是要是换上我上面的子查询,就是2000多秒那种情况了,但是哪个子查询单独查的话又只有0.333秒
鬼鬼,这效率也太恐怖了,sql贴出来看看
我发现了,好像,是加上了子查询,它的查询顺序就发生了变化了,简单的子查询很快,复杂的子查询就变了,难道不是先子查询查出表来,再到where条件筛选然后set更新吗
@YAN_HUAXIANGMO: SQL嵌套会影响效率,拆分开尝试一下
@小光: 怎么拆分?我的结构就是
update 表A,(子查询)as 表B
set 表A.column = "1";
where 表A.column2 = 表B.column2;
这样,子查询要怎么放
看执行计划嘛,这样基本就知道鬼在哪儿了。
我的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
@YAN_HUAXIANGMO:
select * ,你要的新值你自己拼 from test left join test2 on test.name = test2.name
先把这个写完整,跑跑看要几秒
性能达到要求了再改成update
你这是sqlserver。
只能分享执行计划,看看能否改写 或用下临时表或内存表(如果子查询的数据量不大的话)解决。