Mysql

(Mysql) 430 萬行表使用記憶體引擎?

  • January 23, 2018

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

引用自:https://dba.stackexchange.com/questions/195912