web-dev-qa-db-ja.com

Mysql:挿入INNODB対MYISAM

5つの属性と1000行の単純な小さなテーブルに挿入しています。

エンジンがINNODBの場合、各挿入に0.03〜0.05秒かかります。エンジンをMYISAMに変更したところ、挿入が高速になりました。 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

9
Uday

その理由は非常に簡単です。 MyISAMに行を挿入すると、行がサーバーのメモリに挿入されるだけで、サーバーが将来のある時点でそれをディスクにフラッシュすることが期待されます。サーバーがクラッシュした場合は頑張ってください。

InnoDBに行を挿入すると、トランザクションが永続的にディスクに同期され、ディスクが回転するまで待機する必要があります。システムで計算を行い、それがどのくらいかかるかを確認します。

これを改善するには、innodb_flush_log_at_trx_commitを緩和するか、行ごとに1つのトランザクションを実行する代わりに、トランザクション内で行をバッチ処理します。

High Performance MySQL 3rd Edition(私は著者です)を読むことを強くお勧めします。

21
Baron Schwartz

InnoDBはACIDに準拠しており、MVCCを備えており、実際に外部キーをチェックするなどの便利なことを行うため、少し遅くなります。

例として、 MyISAMとInnoDB に関するOracle独自のホワイトペーパー(---)

これらのベンチマークは、緩和されたACID制約を使用して実行され、MyISAMでより比較可能な分析を提供します...

もう1つは、Perconaの「 MyISAMからInnodbに移動しますか?」 (私の太字)からです。

パフォーマンス

...短所としては、テーブルサイズが非常に大きい(特にデータサイズがメモリサイズに近い場合)、一般的に遅い書き込み、遅いblob処理、同時実行の問題、非常に多数のテーブルを処理する問題、データの読み込みが遅い、ALTER TABLEなど。もう1つの大きな問題は、COUNT(*)であり、where句がないため、回避策が見つかるまで移動することがよくあります。

同等の書き込み速度を比較することはできません...

2
gbn

InnoDBを使用している場合、行レベルのロックがあり、MyISAMではテーブルレベルのロックがあります。これは、DBへの接続が1つしかないベンチマークでは意味がありません。しかし、100個の擬似スクリプトを実行して挿入すると、違いは明白になります。

また、InnoDBはデータを物理的に主キーの順序で格納することに注意してください。自動インクリメントではなく、挿入によってなんらかの理由で主キーのランダムな値が生成される場合、ランダムな書き込みによりI/O制限に達します。これは、テーブルサイズがバッファプールよりも大きい場合にベンチマークで確認できます。

1

MyISAMは、ほとんどの場合InnoDBよりもミルの種類の作業の実行の方が高速です。通常の状況では、選択、更新、挿入はすべて非常に高速です。 InnoDBは緩いですが、MyISAMはデータの整合性がより厳密です。 MyISAMには全文検索インデックスがありますが、InnoDBにはありません。

MyISAMの利点:

  • 設計と作成が簡単なので、初心者にはより良いです。テーブル間の外部関係について心配する必要はありません。

  • シンプルな構造の結果、全体としてInnoDBよりも高速で、サーバーリソースのコストが大幅に削減されます。フルテキストインデックス。

  • 特に読み取り集中型(選択)テーブルに適しています。

MySIAM挿入または更新のためにテーブル全体がロックされているため、頻繁に挿入または更新されるテーブルの場合はInnoDBより遅い。

Innodbの利点:

  • InnoDBは、本質的に関係の制約とトランザクションの助けを借りてデータの整合性を処理するため、データの整合性が優先される場合に使用する必要があります。
  • 行レベルのロックを利用し、挿入または更新されている同じ行への変更のみを保持するため、書き込みが多い(挿入、更新)テーブルではより高速です。

結論:比較はかなり簡単です。 InnoDBは、頻繁な挿入と更新を必要とするデータクリティカルな状況により適しています。一方、MyISAMは、データの整合性にあまり依存せず、ほとんどの場合データを選択して表示するだけのアプリケーションでパフォーマンスが向上します。

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

0
Mahesh Patil

エンジン間のINDEXingには微妙な違いがあります。これを確認するまで、一方のエンジンがもう一方のエンジンよりも高速であるという不可解なケースが発生する可能性があります。インデックスをチェックした後でも、どちらかが他よりも速い場合があります。これは私が知っているすべてのケースをカバーしています: http://mysql.rjweb.org/doc.php/myisam2innodb

他の人が言ったように、エンジンに同調します。参照 http://mysql.rjweb.org/doc.php/memory

0
Rick James