Mysql

將 MyISAM 改為 InnoDB,性能損失巨大

  • December 18, 2019

因此,我正在我們的開發伺服器上進行測試,將 MyISAM 更改為 InnoDB,並且性能損失巨大。

這是我的.cnf:

innodb_file_per_table=1
innodb_flush_method=O_DIRECT
innodb_buffer_pool_instance=2
innodb_log_file_size=512M
key_buffer_size=24M
#70% of available RAM
innodb_buffer_pool_size=3072M
innodb_thread_concurrency=0
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000

我正在執行一個 Amazon CentOS t2.medium 實例(2 個 vCPU 和 4 GB 記憶體)。

這是我執行的一些測試。我跑了很多,但主題相同。InnoDB 需要更長的時間並載入更多的 CPU。 在此處輸入圖像描述

有人有什麼想法嗎?我讀過如果你有很多大數據的 INSERTS / UPDATES InnoDB 比 MyISAM 好得多。我不確定我在這裡缺少什麼。

你在你的問題中說

我讀過如果你有很多大數據的 INSERTS / UPDATES InnoDB 比 MyISAM 好得多。我不確定我在這裡缺少什麼。

您的伺服器類對於您的 InnoDB 設置來說太小了。

Apr 14, 2011,我提到了儲存引擎如何有不同的記憶體方式

  • MyISAM 只會在 RAM 中記憶體索引。數據總是從磁碟讀取。
  • InnoDB 在 InnoDB Buffer Pool 中記憶體數據和索引

我還注意到你的 innodb_read_io_threads 和 innodb_write_io_threads 是如何被最大化的。您只有 4GB 的 RAM 或只有 1GB 的可用記憶體(由於您的 3GB 或 3072M 緩衝池)。我會將您的執行緒數從 64 降低到 8。

如果您有預算,您應該將您的伺服器等級升級到m3.large或者m3.xlarge您可以擁有 4 個 CPU 和 15 或 16G 記憶體的地方。然後您可以將 innodb_buffer_pool_size 增加到 10G 或 12G。然後,你剩下的 InnoDB 設置就有意義了。我仍然會將您的執行緒數從 64 降低到 8。

MyISAM 和 InnoDB 的結構不一樣:

MyISAM

什麼時候做 dml(ex:insert) 它只是儲存在記憶體中,然後再推送它。(伺服器崩潰時不好)

InnoDB

需要將該數據同步到磁碟直到完成它會消耗磁碟 I/O。

暗示

  1. 您可以將交易設置為 autocommit=0;
  2. https://dev.mysql.com/worklog/task/?id=6470

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