【问题标题】:Very different execution times for Update on different MySQL systems不同 MySQL 系统上 Update 的执行时间非常不同
【发布时间】:2013-06-23 02:52:14
【问题描述】:

我对 MySQL 有一个很奇怪的情况。

举个例子: 包含 15000 个条目的表

CREATE TABLE `temp_geonis_export` (
`auto_id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
`obj_id` VARCHAR(10),
`gis_id` VARCHAR(45),
`letzteReinigung_id` VARCHAR(10),
INDEX `Index_2`(`gis_id`),
PRIMARY KEY (`auto_id`)
)
ENGINE = InnoDB;

现在我正在更新表中的 14000 行。我知道,这是一个很丑陋的陈述,很容易被重写,但这不是问题......

Update temp_geonis_export as temp
inner join (
Select gis_id, obj_id from 
(
Select abw.gis_id, abw.bezeichnung, erh.obj_id
from od_abwasserbauwerk as abw
inner join od_erhaltungsereignis as erh on erh.fs_abwasserbauwerk = abw.obj_id and erh.status = 2
inner join od_reinigung as unter on unter.obj_id = erh.obj_id
order by fs_abwasserbauwerk asc, erh.zeitpunkt asc
) as alleSortiert group by alleSortiert.gis_id
) as naechsteRein on temp.gis_id = naechsteRein.gis_id
set temp.naechsteReinigung_id = naechsteRein.obj_id;

现在,如果我在我们的开发服务器上运行更新语句,大约需要 1 秒。在我们的一台生产服务器上,这需要 90 秒!!

以下是我的观察:

  • Handler_read_rnd_next 101000(开发)、266177000(生产)
  • 生产系统上的 CPU 使用率非常高(由于上述观察)
  • 两个系统上几乎没有磁盘 IO
  • 当我重写 Update-Query 并将子查询的输出存储到临时表中时,Update-Statement 在两个系统上都很快

根据观察结果,我的结论是,出于某种原因,我们的生产服务器必须对每个更新的行执行全表扫描。开发服务器没有。一定是配置问题,因为我们的服务器都是5.1.25,硬件也差不多。

您有什么线索吗,我必须在我们的生产服务器上进行哪些更改才能使其性能更好?

感谢您的帮助

【问题讨论】:

  • 发布EXPLAINs 以​​供您从开发人员和生产服务器查询
  • peterm, AFAIK, EXPLAIN 更新仅从 MySQL 5.6 开始可用。我只能将它用于子查询。子查询 (Select) 在两个系统上都表现良好。
  • UPDATE 更改为 SELECT 以进行更新中使用的连接,放弃 SET 子句并在两种环境中对查询进行解释并发布它。
  • 感谢您的提示!由于未知原因,我无法将图像上传到我的问题中,所以我将它们上传到这里:开发:link 生产:link
  • 你最好在mysql(命令行)中执行EXPLAIN并发布文本输出。它会更具可读性。现在你可以看到你在生产环境中没有所有必要的索引。

标签: mysql sql indexing subquery database-performance


【解决方案1】:

几个小时后,我终于找到了解决方案:
问题是,生产服务器上的 DEFAULT CHARSET 与数据库中使用的字符集不同。现在,当创建表没有明确指定字符集时,MySQL 没有使用索引。这是因为当连接表的字符集不同时,MySQL 不能在 CHAR-Fields 上使用索引。

非常感谢您的帮助。你为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多