Mysql

插入繁重的 InnoDB 表不會使用我所有的 CPU

  • September 8, 2017

我有一個數據包日誌數據庫,幾乎從不查詢。它只需要快速插入即可。我使用 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 表上的全表鎖定
  • 執行批量載入
  • 釋放鎖

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