我的新公司使用内存引擎将加载过程的中间数据存储在一个表中。然而,一个非常简单的更新(设置 a.id=b.id)大约需要六个小时才能运行。
我检查了这些表有多大,在这次导入中,它们有大约 430 万行数据。我确定问题出在内存引擎和基于 HASH 的 id 上缺少索引(有一个 PK,但它跨越 5 个其他属性)。
我 95% 确定我需要更改表引擎和索引类型,但我想在推动更改之前确定。
编辑:这是这么慢的声明:
select @Extraction_id := id from extraction;
update items as a
set a.extraction_id=@Extraction_id;
编辑2:创建表语句
CREATE TABLE `items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`extraction_id` char(12) NOT NULL,
`a` char(6) NOT NULL,
`b` char(10) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`c` date NOT NULL,
`d` varchar(100) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`e` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
`f` decimal(17,6) DEFAULT NULL,
`g` decimal(17,6) DEFAULT NULL,
`h` varchar(150) DEFAULT NULL,
`i` varchar(150) DEFAULT NULL,
PRIMARY KEY (`id`,`extraction_id`,`a`,`b`,`c,`d`),
KEY `fk_extraction` (`extraction_id`),
) ENGINE=MEMORY AUTO_INCREMENT=2343054016 DEFAULT CHARSET=latin1;
ENGINE=MEMORY
不是为大桌子设计的。InnoDB
为几乎所有用例精心设计;切换到它。听起来您需要的不仅仅是一个
ENGINE
和索引类型的更改。请提供SHOW CREATE TABLE
相关表格,以及这么慢的语句。set a.id=b.id
??-- 按照惯例,DBA 将PRIMARY KEY
id
. 将一张桌子的PK设置为另一张桌子的PK是很奇怪的。分块
解决 4M 行影响较小的一种方法
UPDATEing
是将问题“分块”。我在这里讨论细节。