0

如果我将 300,000 行从表(innodb 或 ndb)移动到 ndb 表中,如下所示:

INSERT INTO ndbtable2
SELECT a, b,IFNULL(c,UTC_TIMESTAMP()),CASE WHEN b = 'X' THEN e ELSE d END,f
FROM ndbtable1;

Query OK, 308372 rows affected (5 min 12.59 sec)
Records: 308372  Duplicates: 0  Warnings: 0

ndb 在完成之前使用越来越多的数据内存。前/峰/后如下

ndb_mgm -e "all report memoryusage"
Connected to Management Server at: fl-prd-mysql1:1186
Node 1: Data usage is 2%(5752 32K pages of total 262144)
Node 1: Index usage is 0%(2428 8K pages of total 262176)
Node 2: Data usage is 2%(5752 32K pages of total 262144)
Node 2: Index usage is 0%(2428 8K pages of total 262176)

Connected to Management Server at: fl-prd-mysql1:1186
Node 1: Data usage is 62%(164013 32K pages of total 262144)
Node 1: Index usage is 1%(3136 8K pages of total 262176)
Node 2: Data usage is 62%(164013 32K pages of total 262144)
Node 2: Index usage is 1%(3136 8K pages of total 262176)

Connected to Management Server at: fl-prd-mysql1:1186
Node 1: Data usage is 3%(10293 32K pages of total 262144)
Node 1: Index usage is 1%(4590 8K pages of total 262176)
Node 2: Data usage is 3%(10293 32K pages of total 262144)
Node 2: Index usage is 1%(4590 8K pages of total 262176)

如果我的数学是正确的,我插入 10293 - 5752 = 4541 = 142 MB,但内存峰值为 164013 - 5752 = 158261 = 4945 MB

此外,如果我将插入限制为 50,000 行,前后差异只有 3MB,则峰值为 780MB。

显然,当 ndb 不为空时,这将是一个问题……这里发生了什么?!

4

1 回答 1

0

在没有解释的情况下,手册确实承认以下限制

如本章其他部分所述,MySQL Cluster 不能很好地处理大型事务。与尝试包含大量操作的单个大事务相比,最好执行多个小事务,每个事务具有少量操作。除其他考虑因素外,大型事务需要非常大量的内存

http://dev.mysql.com/doc/refman/5.5/en/mysql-cluster-limitations-transactions.html

“正如本章其他地方所指出的” ......我已经看过但还没有找到任何具体的东西。

仅供参考,替代方案是:

  1. 循环遍历一行LIMIT(比如 10,000)
  2. 如果插入到空表中,请考虑LOAD DATA甚至使用 innodb 和 finally ALTER TABLE ... ENGINE = ndbcluster(两者都不是事务性的)
于 2013-11-12T21:22:55.763 回答