You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:42:43