我对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;
现在,如果我在开发服务器上运行Update语句,则大约需要1秒。在我们的一台生产服务器上需要90秒!!
这些是我的观察:
由于观察结果,我的结论是,由于某种原因,我们的生产服务器必须对每个更新的行执行全表扫描。开发服务器没有。它必须是配置问题,因为我们的服务器都是5.1.25并且硬件具有可比性。
您有什么线索,我必须在生产服务器上更改以使其表现更好吗?
感谢您的帮助
答案 0 :(得分:0)
几小时后我终于得到了解决方案:
问题是,生产服务器上的 DEFAULT CHARSET 与数据库中使用的字符集不同。现在,在创建表而没有明确指定charset 时,MySQL没有使用索引。这是因为当连接表的字符集不同时,MySQL无法在CHAR字段上使用索引。
非常感谢您的帮助。你指出了我正确的方向。