[英]Improve performance of mysql LOAD DATA / mysqlimport?
我CSV
15GB(30mio 行)批處理到mysql-8
數據庫中。
問題:任務大約需要 20 分鍾,吞吐量約為 15-20 MB/s。 雖然硬盤能夠以 150 MB/s 的速度傳輸文件。
我有一個 20GB 的 RAM 磁盤,其中包含我的 csv。 導入如下:
mysqlimport --user="root" --password="pass" --local --use-threads=8 mytable /tmp/mydata.csv
這在引擎蓋下使用了LOAD DATA
。 我的目標表沒有任何索引,但大約有 100 列(我無法更改)。
奇怪的是:我嘗試在/etc/mysql/my.cnf
中調整幾個配置參數,如下所示,但它們並沒有帶來任何顯着的改進:
log_bin=OFF
skip-log-bin
innodb_buffer_pool_size=20G
tmp_table_size=20G
max_heap_table_size=20G
innodb_log_buffer_size=4M
innodb_flush_log_at_trx_commit=2
innodb_doublewrite=0
innodb_autoinc_lock_mode=2
問題: LOAD DATA
/ mysqlimport
是否尊重這些配置更改? 還是繞過? 還是我使用了正確的配置文件?
變量上至少有一個 select 表明它們已由 mysql 服務器正確加載。 例如show variables like 'innodb_doublewrite'
顯示OFF
無論如何,我怎樣才能進一步提高導入速度? 還是我的數據庫是瓶頸,沒有辦法克服 15-20 MB/s 的閾值?
更新:有趣的是,如果我將 csv 從硬盤驅動器導入 ramdisk,性能幾乎相同(只是稍微好一點,但從不超過 25 MB/s)。 我還測試了相同數量的行,但只有幾 (5) 列。 在那里我達到了大約 80 MB/s。 很明顯,列數是瓶頸? 但是為什么更多的列會減慢這個過程呢?
MySQL/MariaDB 引擎在進行批量插入時幾乎沒有並行化。 每個LOAD DATA
語句只能使用一個 CPU 內核。 您可能會在負載期間監控 CPU 利用率,以查看一個內核已被充分利用,它只能提供這么多的 output 數據 - 從而導致磁盤吞吐量未得到充分利用。
The most recent version of MySQL has new parallel load feature: https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-parallel-table.html . 它看起來很有希望,但可能還沒有收到太多反饋。 我不確定這對你的情況有幫助。
我在互聯網上看到了各種清單,建議在以下配置參數中設置更高的值: log_buffer_size
、 log_file_size
、 write_io_threads
、 bulk_insert_buffer_size
。 但是當我進行比較測試時,好處並不是很明顯(可能比innodb_buffer_pool_size
足夠大快 10-20%)。
這可能是正常的。 讓我們來看看正在做的事情:
結果表有多大? 它可能比 csv 文件的 15GB 大得多,甚至更小。
將 csv 文件放入 ram 磁盤需要多少時間? 我認為那是浪費時間,應該在執行LOAD DATA
時從磁盤讀取; I/O 可以重疊。
請SHOW GLOBAL VARIABLES LIKE 'innodb%';
; 還有其他幾個可能相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.