將 MyISAM 改為 InnoDB,性能損失巨大
因此,我正在我們的開發伺服器上進行測試,將 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。
暗示
- 您可以將交易設置為 autocommit=0;
- https://dev.mysql.com/worklog/task/?id=6470