Mysql
插入繁重的 InnoDB 表不會使用我所有的 CPU
我有一個數據包日誌數據庫,幾乎從不查詢。它只需要快速插入即可。我使用 InnoDB 是因為我想保持 ACID 合規性,因為即使失去一個數據包也可能對我們的客戶造成損害。在性能調整場景中,我通過多個數據庫連接向伺服器發送 1,000,000 個數據包。但無論我在 my.cnf 中使用什麼設置,我都無法讓 mysqld 程序在 12 核系統上使用超過 900% 的 CPU。(盒子上沒有其他東西在執行。)
我設置了以下
innodb_file_per_table = 1
innodb_write_io_threads = 64
innodb_read_io_threads = 64
innodb_thread_concurrency = 0
如果我使用 MyISAM,我可以在大約 6 秒內獲得所有寫入的數據包。但是 InnoDB 大約需要 25。我可以讓 MySQL 使用其餘的系統資源並更快地插入嗎?
編輯:這是表的架構:
+-------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+-------+ | t | bigint(20) unsigned | YES | | NULL | | | a | char(1) | YES | | NULL | | | sa | int(10) unsigned | YES | | NULL | | | sb | int(10) unsigned | YES | | NULL | | | sc | int(10) unsigned | YES | | NULL | | | sd | int(10) unsigned | YES | | NULL | | | sp | smallint(5) unsigned | YES | | NULL | | | da | int(10) unsigned | YES | | NULL | | | db | int(10) unsigned | YES | | NULL | | | dc | int(10) unsigned | YES | | NULL | | | dd | int(10) unsigned | YES | | NULL | | | dp | smallint(5) unsigned | YES | | NULL | | +-------+----------------------+------+-----+---------+-------+
edit2:我已經將更多的插入批處理在一起,以便單個查詢接近最大長度(大約 16,000,000 個字元)。數據庫現在在兩秒內飆升至 1100%,然後在其餘時間降至 100%。總時間現在是 21 秒,比我開始時快 16%。
您還必須提高innodb_io_capacity。
預設值為 200。初學者將其提高到 5000。我會去20000。
您可能還想確保
ib_logfile0
並且ib_logfile1
足夠大。innodb_log_file_size的預設值為5M。對於初學者,我會將其提高到 1G。更大的 InnoDB 緩衝池也會有所幫助,也許是 4G。
回顧一下,使用這些附加設置:
[mysqld] innodb_io_capacity=5000 innodb_buffer_pool_size=4G innodb_log_file_size=1G
將這些設置添加到 my.cnf 後,要調整 ib_logfile0/ib_logfile1 的大小,請執行以下操作
service mysql stop rm -f /var/log/mysql/ib_logfile[01] service mysql start
文件 ib_logfile0 和 ib_logfile1 被重新創建。別擔心,我已經做過很多次了。
您可能需要為 InnoDB 做一些與眾不同的事情
嘗試以下操作:
- InnoDB 表上的全表鎖定
- 執行批量載入
- 釋放鎖