Mysql
加速 longtext 或 longblob 列的插入
我目前正在使用 SQL WORKBENCH工具將 DB2 數據庫遷移到 MySQL
它基本上是從 DB2 中選擇並插入到 DB2。
它工作正常,但在具有 longblob 或 longtext 列(用於儲存 xml 或圖像)的表上,它需要大量時間。(對於 10M 行的表大約需要 40 小時)。
事實:
- 伺服器:2CPU 核心和 8GB 記憶體作業系統:Linux RHEL 6.5
- MySQL 伺服器 5.6.13
- 表是 InnoDB。
- MySQL 伺服器和遷移工具在同一台電腦上,因此沒有網路成本。
- MySQL 上的表有 PRIMARY KEYS 但沒有任何其他索引。
- 我為大量插入禁用了二進制日誌。
- 我將遷移工具配置為批量插入 10
行並送出每個插入(10 行)。
這裡有兩個問題:
- 考慮到列的大小(longtext、longblob),建議批量插入大小的值是多少?
- 是否建議對 my.cnf 進行任何調整以提高插入性能?
這是 my.cnf 文件的內容:
[mysqld] open_files_limit=2048 table_open_cache=1024 query_cache_type=1 query_cache_size=64M tmp_table_size=32M thread_cache_size=9 default-storage-engine=INNODB back_log=80 flush_time=0 join_buffer_size=1M max_allowed_packet=1G max_connect_errors=100 sort_buffer_size=256K table_definition_cache=1400 binlog_row_event_max_size=8K log-bin log_bin_trust_function_creators=1 #INNODB innodb_additional_mem_pool_size=8M innodb_flush_log_at_trx_commit=1 innodb_data_file_path = ibdata1:5G:autoextend innodb_log_buffer_size=16M innodb_buffer_pool_size=6144M innodb_log_file_size=1GB innodb_thread_concurrency=3 innodb_autoextend_increment=64 innodb_concurrency_tickets=5000 innodb_old_blocks_time=1000 innodb_open_files=300 innodb_stats_on_metadata=0 innodb_file_per_table=1 innodb_checksum_algorithm=0
InnoDB 架構(來自 Percona 首席技術官 Vadim Tkachenko)
- 考慮到列的大小(longtext、longblob),建議批量插入大小的值是多少?
將 innodb_log_buffer_size增加到256M
將 innodb_log_file_size增加到2G
我過去寫過增加這些以適應 TEXT/BLOB 欄位
Apr 20, 2011
: MySQL 在插入大文件時出現“Out of Memory”錯誤。這個文件大小限制是從哪裡產生的?Apr 27, 2011
:更改了 max_allowed_packet 並且仍然收到“數據包太大”錯誤Aug 01, 2011
: max_allowed_packet 如何影響數據庫的備份和恢復?
- 是否有任何調整建議
my.cnf
以提高插入性能?
- 增加寫入 I/O 執行緒(有關更多資訊,請參閱配置後台 InnoDB I/O 執行緒數)
- 將innodb_thread_concurrency更改為預設設置 0
提議的變更
[mysqld] innodb_log_buffer_size = 256M innodb_log_file_size = 2G innodb_write_io_threads = 16 innodb_thread_concurrency = 0
試一試 !!!