INSERT INTO ndbtable Таблица SELECT FROM использует смешные объемы памяти в MySQL Cluster

Если я переместу 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 МБ, но перепады памяти на 164013 - 5752 = 158261 = 4945 МБ

Кроме того, если я ограничу вставку до 50 000 строк, с разницей до / после только 3 МБ, всплеск составит 780 МБ.

Очевидно, это будет проблемой, когда ndb не пусто... что здесь происходит?!

1 ответ

Решение

В отсутствие объяснения руководство признает ограничение следующим

Как отмечалось в других разделах этой главы, MySQL Cluster плохо обрабатывает большие транзакции; Лучше выполнить несколько небольших транзакций с несколькими операциями в каждой, чем пытаться выполнить одну большую транзакцию, содержащую большое количество операций. Среди прочих соображений большие транзакции требуют очень больших объемов памяти.

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

"Как отмечено в другом месте этой главы"... Я смотрел, но пока не нашел ничего конкретного.

К вашему сведению альтернативы:

  1. Цикл итераций со строкой LIMIT (скажем, 10000)
  2. Если вставить в пустую таблицу, рассмотрите LOAD DATA или даже используя innodb и, наконец, ALTER TABLE ... ENGINE = ndbcluster (ни один из них не является транзакционным)
Другие вопросы по тегам