Mysql

MySQL - 載入文件後刷新記憶體

  • June 14, 2020

我正在使用 LOAD FILE 命令載入 CSV 文件中的大量數據。它工作正常,載入該文件後,它執行一些數據轉換……

問題是,例如載入 12 個文件(每個文件 400 MB)後,mysql 程序幾乎消耗了所有可用記憶體,它沒有刷新,所以機器速度變慢,我需要重新啟動 mysql 才能繼續載入數據文件。

MySQL 8.0.17

任何想法如何解決這個問題?

  • 添加了儲存過程
BEGIN
DECLARE sequenceid INT;

DECLARE `_rollback` BOOL DEFAULT 0;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET `_rollback` = 1;


START TRANSACTION;

INSERT INTO filenamedt (filename, filedate, fileinitialid) VALUES (CAfilename, now(), (SELECT MAX(imp_sequence_id) + 1 FROM imp_siscori_sequence));

INSERT INTO imp (select imp, ordem, CONCAT(TRIM(data),'01')) FROM temp_imp);

INSERT INTO imp_data (imp_id, unid_comerc, incoterm) (SELECT imp_id, TRIM(unidadeComercial),  TRIM(incoterm),  TRIM(natInformacao) FROM temp_imp );

INSERT INTO imp_description (imp_id, imp_description) (SELECT imp_id, TRIM(descricaoProduto) FROM temp_imp);

UPDATE imp_sequence SET imp_sequence_id  = (SELECT MAX(imp_id) + 1 FROM temp_imp_siscori);

TRUNCATE TABLE temp_imp;

SET @m = (SELECT MAX(imp_sequence_id) + 1 FROM imp_sequence); 

SET @s = CONCAT('ALTER TABLE temp_imp AUTO_INCREMENT=', @m);

PREPARE stmt1 FROM @s;

EXECUTE stmt1;

DEALLOCATE PREPARE stmt1;

IF `_rollback` THEN

   ROLLBACK;

ELSE

   COMMIT;

END IF;

如果你不使用 MyISAM 做任何事情(你不應該),那麼key_buffer_size 999997440改為只有 10M。那是浪費的千兆字節。

此外,這對於您的 8GB RAM 來說似乎相當大: tmp_table_size 268435456. 將其降低到 16M。

每秒速率 = RPS

為您的 AWS RDS 性能組考慮的建議

innodb_flush_neighbors=2  # from 0 to speed reduction of innodb_buffer_pool_pages_dirty of 11,890
innodb_lru_scan_depth=100  # from 1024 to conserve 90% of CPU cycles used for function
innodb_change_buffer_max_size=50  # from 25 to expedite LOADing data
read_rnd_buffer_size=64K  # from 512K to reduce handler_read_rnd_next RPS of 16,317

Rick James 2020-06-12 22:40 的兩個建議都將節省 RAM。

有關其他建議,請查看我的個人資料、聯繫資訊的網路個人資料和可免費下載的實用程序腳本以幫助進行性能調整。

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