簡體   English   中英

提高 mysql LOAD DATA / mysqlimport 的性能?

[英]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_sizelog_file_sizewrite_io_threadsbulk_insert_buffer_size 但是當我進行比較測試時,好處並不是很明顯(可能比innodb_buffer_pool_size足夠大快 10-20%)。

這可能是正常的。 讓我們來看看正在做的事情:

  • 正在從 RAM 磁盤讀取 csv 文件,因此不使用 IOP。
  • 你在使用 InnoDB 嗎? 如果是這樣,數據將進入 buffer_pool。 在那里構建塊時,它們被標記為“臟”以最終刷新到磁盤。
  • 由於 buffer_pool 很大,但可能沒有表那么大,因此在讀取完所有數據之前需要刷新一些塊。
  • 讀完所有的數據,表完成后,臟塊會逐漸刷新到磁盤。
  • 如果您有非唯一索引,它們同樣會以延遲方式寫入磁盤(參見“更改緩沖”)。 change_buffer,默認占用buffer_pool的25%。

結果表有多大? 它可能比 csv 文件的 15GB 大得多,甚至更小。

將 csv 文件放入 ram 磁盤需要多少時間? 我認為那是浪費時間,應該在執行LOAD DATA時從磁盤讀取; I/O 可以重疊。

SHOW GLOBAL VARIABLES LIKE 'innodb%'; ; 還有其他幾個可能相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM