【发布时间】:2011-05-12 20:29:37
【问题描述】:
这个 MySQL 更新语句大约需要 7 秒,我想知道如何提高它的性能。整个查询非常慢,所以我开始将其分解成更小的部分(一次 100 个 id):
UPDATE results
INNER JOIN urls
ON urls.id = results.url_id
SET results.url = urls.name
WHERE results.url_id >= 100
AND results.url_id < 200
基本上,我正在构建一个非规范化的“结果”表,该表最初对于 results.url 为 NULL。我需要从urls.name 字段中填写,这需要很长时间。此查询修改了大约 25,000 条记录。
当我分析查询时,我看到的结果如下:
starting 0.000052
checking permissions 0.000004
checking permissions 0.000005
Opening tables 0.000012
checking permissions 0.000003
checking permissions 0.000004
System lock 0.000004
Table lock 0.000007
init 0.000013
updating main table 0.000005
optimizing 0.000015
statistics 0.000114
preparing 0.000030
executing 0.000004
Sending data 0.239372
converting HEAP to MyISAM 0.165893
Sending data 0.239267
updating reference tables 6.585605
end 0.000029
end 0.000008
removing tmp table 0.007922
end 0.000007
query end 0.000005
freeing items 0.000286
logging slow query 0.000005
cleaning up 0.000004
由于查询大部分时间都在“更新”(超过 6.5 秒),我可以在这里做些什么吗?我不清楚这是否意味着 mysql 正在花费时间定位要更新的行,或者它是否花费时间只是将位从一个表复制到另一个。
如果将值从一个表复制到另一个表需要 6.5 秒,我无能为力(我假设,因为它看起来没有任何东西要写入磁盘?)但是如果它花费时间将行定位到更新,我认为索引可能会有所帮助。我在results.url_id 上添加了一个索引,但它似乎没有起到作用。
【问题讨论】:
-
您是如何获得上述个人资料统计信息的?用了什么工具?
-
很确定它的 SHOW PROFILES 命令,见here