Mysql

Mysql:插入性能 INNODB 與 MISAM

  • February 6, 2022

我正在插入一個具有 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 子句,這通常是他們移動的阻礙,直到它被解決。

您無法比較同類的寫入速度…

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