Mysql:插入性能 INNODB 與 MISAM
我正在插入一個具有 5 個屬性和 1000 行的簡單小表。
我觀察到當引擎是 INNODB 時,每次插入需要 0.03 - 0.05 秒。我將引擎更改為 MISAM,然後插入速度更快。它需要 0.001 - 0.003。
問題是什麼。innodb_flush_log_trx_commit = 1 預設情況下。我就是這個設置。這是我的 innodb 設置。
innodb_log_buffer_size : 1MB innodb_log_file_size : 5MB innodb_buffer_pool_size: 8MB innodb_flush_log_trx_commit = 1 mysql> desc table ; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(10) | YES | | NULL | | | count | int(10) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.00 sec)
變數
mysql> show variables like 'innodb%' ; +-----------------------------------------+------------------------+ | Variable_name | Value | +-----------------------------------------+------------------------+ | innodb_adaptive_hash_index | ON | | innodb_additional_mem_pool_size | 1048576 | | innodb_autoextend_increment | 8 | | innodb_autoinc_lock_mode | 1 | | innodb_buffer_pool_size | 8388608 | | innodb_checksums | ON | | innodb_commit_concurrency | 0 | | innodb_concurrency_tickets | 500 | | innodb_data_file_path | ibdata1:10M:autoextend | | innodb_data_home_dir | | | innodb_doublewrite | ON | | innodb_fast_shutdown | 1 | | innodb_file_io_threads | 4 | | innodb_file_per_table | OFF | | innodb_flush_log_at_trx_commit | 1 | | innodb_flush_method | | | innodb_force_recovery | 0 | | innodb_lock_wait_timeout | 50 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 2097152 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_max_dirty_pages_pct | 90 | | innodb_max_purge_lag | 0 | | innodb_mirrored_log_groups | 1 | | innodb_open_files | 300 | | innodb_rollback_on_timeout | OFF | | innodb_stats_method | nulls_equal | | innodb_stats_on_metadata | ON | | innodb_support_xa | ON | | innodb_sync_spin_loops | 20 | | innodb_table_locks | ON | | innodb_thread_concurrency | 8 | | innodb_thread_sleep_delay | 10000 | | innodb_use_legacy_cardinality_algorithm | ON |
+——————————————+——– —————–+ 36 行(0.00 秒)
我無法弄清楚這齣了什麼問題。提前致謝。問候, UDAY
原因很簡單。當您在 MyISAM 中插入一行時,它只是將其放入伺服器的記憶體中,並希望伺服器在將來的某個時間將其刷新到磁碟。如果伺服器崩潰,祝你好運。
當您在 InnoDB 中插入一行時,它會將事務持久地同步到磁碟,這需要它等待磁碟旋轉。在您的系統上進行數學運算,看看需要多長時間。
您可以通過放鬆 innodb_flush_log_at_trx_commit 或通過在事務中批處理行而不是每行執行一個事務來改進這一點。
我強烈推薦閱讀高性能 MySQL 第 3 版(我是作者)。
InnoDB 會稍微慢一些,因為它是 ACID 兼容的,有 MVCC 並且做一些有用的事情,比如實際檢查外鍵等。
例如,Oracle 自己的 MyISAM 與 InnoDB 白皮書,他們實際上說
這些基準測試是在寬鬆的 ACID 約束下執行的,以提供與 MyISAM 更具可比性的分析……
另一個,來自 Percona 的“你應該從 MyISAM 遷移到 Innodb 嗎?” (我的大膽)
表現
…雖然在缺點方面,我們看到表大小非常大(特別是如果數據大小接近記憶體大小),通常寫入速度較慢,blob 處理速度較慢,並發問題,處理大量表的問題,數據載入速度慢和ALTER TABLE 等。另一個重要的是 COUNT(*) 沒有 where 子句,這通常是他們移動的阻礙,直到它被解決。
您無法比較同類的寫入速度…