MySQL 更新基于 ID 慢(150,000 条记录)
Posted
技术标签:
【中文标题】MySQL 更新基于 ID 慢(150,000 条记录)【英文标题】:MySQL Update Based on ID Slow (150,000 records) 【发布时间】:2016-04-18 04:30:23 【问题描述】:我正在尝试根据另一个表上的 id 更新一个表,但我遇到了一些性能问题。我在 table_to_update 上有 150,000 行,在 table_to_get_data 上有 400,000 行。
要更新的表
+----+-----------------+
| id | field_to_update |
+----+-----------------+
| 1 | orange |
| 2 | apple |
| 3 | pear |
| 1 | orange |
+----+-----------------+
获取数据的表
+----+-----------------+
| id | field |
+----+-----------------+
| 1 | orange |
| 2 | apple |
| 3 | pear |
+----+-----------------+
所以我尝试了 3 种不同的方法:
方法一:
UPDATE table_to_update t1, table_to_get_data t2
SET t1.field_to_update = t2.field
WHERE t1.id = t2.id
方法二:
UPDATE table_to_update
JOIN table_to_get_data
ON table_to_update.id = table_to_get_data.id
SET table_to_update.field_to_update = table_to_get_data.field
方法三:
UPDATE table_to_update
LEFT JOIN table_to_get_data
ON table_to_update.id = table_to_get_data.id
SET table_to_update.field_to_update = table_to_get_data.field
到目前为止,方法 3 似乎是最快的,但是,计算更新 1000 行所需的时间,我需要 12 个小时才能完成整个表的更新。有没有更高效的方法来更新表格?
编辑: 添加了解释表 EXPLAIN Table
【问题讨论】:
列是否按应有的方式编入索引?您也可以尝试运行EXPLAIN <query>
以查看查询将如何执行。
显示您的创建表查询并在每三个 sql 方法之前运行 Explain。
向我们展示您的疑问的解释
谢谢,EXPLAIN 表可以找到here
【参考方案1】:
在您从两个表连接的列上创建索引。
它会为你创造奇迹。
【讨论】:
我没有添加任何索引,但是根据w3schools,索引非常适合搜索,但可能需要更多时间来更新。 我不同意这一点。添加索引并自己尝试。如果没有帮助,您可以随时删除索引。 当然,会试一试。谢谢。 哇哦,添加索引已将 12 小时的查询缩短到不到 10 秒!谢谢!! "索引非常适合搜索" -- 您正在table_to_get_data
中搜索。 “但需要更多时间来更新”——这远比另一个重要。以上是关于MySQL 更新基于 ID 慢(150,000 条记录)的主要内容,如果未能解决你的问题,请参考以下文章
MySQL“错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)”
mysql error 1025 (HY000): Error on rename of './foo' (errorno: 150) 是啥意思?
SQLSTATE [HY000]:一般错误:1005 无法创建表 `ic`.`livros`(errno: 150 "外键约束格式不正确") id`))