最近再做一次连表更新的操作。主表15w数据。从表是1000w左右的数据。
sql如下:
UPDATE `iae_deliverysuccess_balance_2019_03` iae
LEFT JOIN `orderbalancestate` obs on iae.`orderno`= obs.`orderNo`
SET iae.`balanceNo` = obs.`sellerBalanceNO`
WHERE obs.`type`= 3
AND obs.`isDelete`= 0;
其中关键字段都是有索引的。
另外一张表也是有索引的。其实这个按自己以往的经验会是很快的。5s内应该能更新完成。
EXPLAIN 看了下,发现也走了索引,但是关键连表字段的那个字段没有走索引。心里想这个 这次更新的数据量也不大,慢一点到时能接受的,就没想太多就直接执行了。
但是啊。。。。。巴特啊 。。。。我等了半小时,逼的我时不时的还得去看看时不时把我的数据库锁死了。我以为半小时已经到了极限了,差不多快好了。然鹅,我感觉他想奔着一小时去了。
快一小时了。我擦勒。6.30了。。。。下班了。我隐隐觉得这哪里会有问题。但是996是不存在的(主要是这个任务不着急o(∩_∩)o 哈哈)。
后面是第二天早上了,7.30.我又打开了数据库。EXPLAIN 一下,还是一样的。很无奈。
我一边执行一边打开这两个表查看一下,索引还是有都在的,我在网上看了说字段类型不一致会导致不走索引,这个一点我知道。但是我还是点开字段看了看,都是varchar,这个可以排除了。
忽然…
吗的。这一点不一样。救命稻草啊!或许就里了,我试一哈。
ALTER TABLE `iae_deliverysuccess_balance_2019_03`
MODIFY COLUMN `orderno` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL AFTER `expressNo`;
ok。
EXPLAIN下
对不起打扰了。
。。索引的原理还是没了解到。空了我再查查资料吧。