是否可以加快 MySQL 的“更新参考表”线程状态?

Posted

技术标签:

【中文标题】是否可以加快 MySQL 的“更新参考表”线程状态?【英文标题】:Is it possible to speed up MySQL's "Updating Reference Tables" thread state? 【发布时间】: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 【参考方案1】:

urls.idresults.url_id 上应用索引,然后重试。

【讨论】:

谢谢。我确实在 results.url_id 上添加了一个索引,而 urls.id 是表的主键。上面的配置文件是在添加索引之后。 urls.id 和 results.url_id 的数据类型是否相同?如果不是,则可能是数据库服务器被占用,转换数据以匹配索引。 @Bjoern 是的。 results.url_id 是 int(11) NOT NULL 并且 urls.id 是 int(11) NOT NULL AUTO_INCREMENT。我想我的部分问题是“更新参考表”到底是什么意思——它是在寻找行、物理更新行还是两者兼而有之? 来自dev.mysql.com/doc/refman/5.0/en/general-thread-states.html:“服务器正在执行多表更新的第二部分,并从其他表中更新匹配的行。” 酷,是的。不过我很困惑,因为同一份文档也有关于“更新”状态的说明:“线程正在搜索要更新的行并正在更新它们。”【参考方案2】:

该更新是否经常运行?

如果是这样 - 尝试只更新真正不同的值。

如果没有 - 让我们说每天一次 7 秒相当快。

【讨论】:

以上是关于是否可以加快 MySQL 的“更新参考表”线程状态?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 MySQL 中加快 sum() 的速度?

加快 MySQL 中的行计数

MySQL 5.7 基于复制线程SQL_Thread加快恢复的尝试

mysql processlist 线程状态

zabbix监控mysql主从状态

MySQL基础篇--全局缓存和线程缓存