2

最近、すべての整合性を強制するために、さまざまな mysql テーブルに多くのトリガーを追加しました。単純な更新に非常に時間がかかるため、エンジンを停止したのではないかと心配しています。

検討:

UPDATE `partner_stats` SET earnings=1 WHERE date=CURRENT_DATE()
0 rows affected. ( Query took 0.6523 sec ) 

SELECT * FROM  `partner_stats` WHERE date = CURRENT_DATE() 
1 total, Query took 0.0004 sec

SELECT0.0004 かかりますが、単純な 0.65かかりUPDATEます!

この特定のテーブルには行が 1 つしかなく、それに関連付けられたトリガーはありません。エンジンを MyISAM に切り替えると問題は解決しますが、将来このテーブルにトリガーを追加する必要があるため、InnoDB を使い続けたいと考えています。

エンジンの何が問題なのですか? 他のテーブルでの作業が忙しすぎませんか? どのようなプロファイリングまたはデバッグ オプションがありますか?

編集:プロファイリングを行い、これを示しています:

mysql> show profile for QUERY 2;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000064 |
| checking permissions | 0.000008 |
| Opening tables       | 0.000032 |
| System lock          | 0.000007 |
| init                 | 0.000051 |
| Updating             | 0.000069 |
| end                  | 0.011682 |
| query end            | 0.218070 |
| closing tables       | 0.000016 |
| freeing items        | 0.000017 |
| logging slow query   | 0.000003 |
| cleaning up          | 0.000002 |
+----------------------+----------+
12 rows in set (0.00 sec)
4

1 に答える 1

1

here で説明されているように、InnoDB エンジンの最適化を試みる必要があります。レプリケーションのない運用サーバーでは、次を使用できます。

innodb_flush_log_at_trx_commit = 2

# ACID 準拠には値 1 が必要です。1 以外の値を設定することでパフォーマンスを向上させることができますが、クラッシュで失われる可能性のあるトランザクションは最大で 1 秒です。

innodb_buffer_pool_size = [合計メモリの 75%]

innodb_log_file_size = [innodb_buffer_pool_size の 25%]

innodb_log_buffer_size = [innodb_log_file_size の 10%]

innodb_thread_concurrency = [2 X CPU の数) + ディスクの数、または自動検出の場合は 0]

于 2014-01-30T09:22:35.797 に答える