MySQL关联更新语句执行极慢且无法完成的原因排查求助
MySQL关联更新语句执行极慢且无法完成的原因排查求助
各位MySQL大佬,我最近碰到个头疼的问题,写了一条关联更新语句,结果慢到完全跑不完,想请大家帮忙分析下原因。
我的更新语句是这样的:
UPDATE `temp_table`, `sms` SET `sms`.`to` = `temp_table`.`new_value` WHERE `sms`.`to` = `temp_table`.`old_value`;
背景信息:
temp_table约有20万行数据,sms表有200万行sms.to、temp_table.new_value、temp_table.old_value都是VARCHAR(255)类型,且都已建立索引- 字段存储的是英国手机号
我试着去看执行计划,但没摸到明确的问题点,下面是两个表的建表和索引语句:
temp_table的建表&索引语句:
CREATE TABLE `temp_table` ( `old_value` varchar(255) DEFAULT NULL, `new_value` varchar(255) DEFAULT NULL ) ENGINE = InnoDB DEFAULT CHARSET = latin1 COLLATE = latin1_swedish_ci; ALTER TABLE `temp_table` ADD KEY `old_value` (`old_value`), ADD KEY `new_value` (`new_value`);
sms的建表&索引语句:
CREATE TABLE `sms` ( `id` int(11) NOT NULL, `branch_id` int(11) DEFAULT NULL, `customer_id` int(11) DEFAULT NULL, `message_id` int(11) DEFAULT NULL, `message` text DEFAULT NULL, `from` varchar(255) DEFAULT NULL, `to` varchar(255) DEFAULT NULL, `status` varchar(255) DEFAULT NULL, `created_at` int(11) DEFAULT NULL, `updated_at` int(11) DEFAULT NULL ) ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci; ALTER TABLE `sms` ADD PRIMARY KEY (`id`), ADD KEY `idx-sms-branch_id` (`branch_id`), ADD KEY `idx-sms-customer_id` (`customer_id`), ADD KEY `idx-sms-message_id` (`message_id`), ADD KEY `idx-sms-to` (`to`), ADD KEY `idx-sms-created_at` (`created_at`), ADD KEY `idx-sms-updated_at` (`updated_at`); ALTER TABLE `sms` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
我自己初步怀疑的几个方向,但拿不准:
- 两个表字符集不匹配?
temp_table是latin1,sms是utf8,会不会导致关联时索引直接失效了? - 这种多表更新的写法是不是有问题,导致MySQL没正确用上索引?
- 会不会是要更新的行数太多,事务太大拖慢了整个过程?
有没有大佬能帮我定位下问题,或者给点优化建议?
备注:内容来源于stack exchange,提问作者dai.hop
相关产品推荐
相关产品推荐

