Mysql
(Mysql) 430 萬行表使用記憶體引擎?
我的新公司使用記憶體引擎將載入過程的中間數據儲存在表中。然而,一個非常簡單的更新(設置 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
是將問題“分塊”。我在這裡討論細節。