这个MySQL更新语句大约需要7秒钟,我想知道如何提高它的性能。整体查询非常慢,所以我开始把它分解成更小的部分(一次100个):
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
上添加了一个索引,但它似乎没有做到这一点。
答案 0 :(得分:0)
在urls.id
和results.url_id
上应用索引,然后重试。
答案 1 :(得分:0)
该更新是否经常运行?
如果是这样 - 尝试仅更新真正不同的值。
如果不是 - 7s让我们说每天一次很快。