MySQLはテーブルごとに読み取り/書き込み


8

DBを最適化しています。本質的に私は私たちのデータベースで最も多く書かれ最も多く読まれたテーブルを見つけようとしています。その後、それらのテーブルを個別のドライブにシンボリックリンクします。

各テーブルのアクティビティを追跡する方法はありますか?以下のように、IOPS、テーブルごとの書き込み、読み取り?

回答:


10

方法1

あなたが使用している場合はPerconaサーバーMariaDBを(> = 5.2)、あなたは簡単に設定することができuserstat_running / userstatを正確にこの情報を提供すると呼ばれる1つTABLE_STATISTICS含む新しいINFORMATION_SCHEMAテーブルの束を有効にするには、変数を。

例えば:

mysql> SELECT TABLE_NAME, ROWS_READ, ROWS_CHANGED, ROWS_CHANGED_X_INDEXES FROM TABLE_STATISTICS ORDER BY ROWS_CHANGED DESC LIMIT 5;
+-------------------+------------+--------------+------------------------+
| TABLE_NAME        | ROWS_READ  | ROWS_CHANGED | ROWS_CHANGED_X_INDEXES |
+-------------------+------------+--------------+------------------------+
| user              |   21122527 |      5989231 |               23956924 |
| audit             |       1208 |      5020929 |               20083716 |
| sometemp          |   13995426 |      3182150 |                9546450 |
| creditcards       |    3566482 |      2998976 |               11995904 |
| order             | 2147483647 |      2662606 |               53252120 |
+-------------------+------------+--------------+------------------------+

ROWS_CHANGEDは、最も多く書き込まれたテーブルに対応し、ROWS_READは最も多くのテーブルから読み取られます。また、INDEX_STATISTICSを調べて、最も使用されているインデックスと最も使用されていないインデックスを見つける必要があります。

MariaDBユーザー統計のドキュメントもご覧ください。

方法2

Percona Serverを使用していない場合は、pt-query-digestを使用してクエリのサンプルをキャプチャし、INSERT / UPDATE / DELETEのみをフィルターで除外できます。これは次のようになります。

mysql> SELECT @@GLOBAL.slow_query_log_file;
+------------------------------------------+
| @@GLOBAL.slow_query_log_file             |
+------------------------------------------+
| /var/logs/mysql/slowquery.log            |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL slow_query_log_file='/tmp/allqueries.log';
mysql> SELECT @@GLOBAL.long_query_time;
+--------------------------+
| @@GLOBAL.long_query_time |
+--------------------------+
|                 0.250000 |
+--------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL long_query_time = 0;
mysql> FLUSH LOGS;
mysql> SLEEP 600; SET GLOBAL long_query_time = 0.25; SET GLOBAL slow_query_log_file='/var/logs/mysql/slowquery.log'; FLUSH LOGS;

これ/tmp/allqueries.logで、サーバーで約10分間実行されたすべてのクエリを含むファイルが作成されました。

次に、pt-query-digestを使用して分析し、最も頻繁にテーブルに書き込まれるようにします。

pt-query-digest /tmp/allqueries.log --group-by=distill --filter '$event->{arg} =~ m/^(update|delete|insert)/i' --limit 5 > /tmp/writes.txt

を調べる/tmp/writes.txtと、上部の近くに次のようなセクションが表示されます。

# Profile
# Rank Query ID Response time Calls R/Call Apdx V/M   Item
# ==== ======== ============= ===== ====== ==== ===== ====================
#    1 0x        0.0558 26.8%   282 0.0002 1.00  0.00 INSERT UPDATE user
#    2 0x        0.0448 21.5%   246 0.0002 1.00  0.00 UPDATE audit
#    3 0x        0.0228 10.9%    11 0.0021 1.00  0.00 UPDATE sometemp
#    4 0x        0.0108  5.2%    16 0.0007 1.00  0.00 UPDATE creditcards
#    5 0x        0.0103  4.9%    43 0.0002 1.00  0.00 UPDATE order

おおまかに言って、これらは選択したサンプルの期間中に最も多くテーブルに書き込まれます。(大体)テーブルからほとんどの読み取りを取得するには、--filterパラメーターをに変更する--filter '$event->{arg} =~ m/^select/i'と、同様の出力が表示されます。

書き込みのみに関心がある場合は、バイナリログを渡して、pt-query-digest同様の結果を得ることができます。

mysqlbinlog mysql-bin.000511 | pt-query-digest --type=binlog --group-by=distill > /tmp/writes.txt

tcpdumpを使用して同じデータを取得することもできます。 pt-query-digest --type=tcpdump

したがって、これは言われていることですが、InnoDBテーブルを使用していると仮定すると、これを実行することでパフォーマンスが大幅に向上することは間違いありません。データがInnoDBログにバッファーされてからディスクに書き込まれる方法が原因で、このように個々のテーブルを移動することによるパフォーマンスの向上は期待できません。あなたは可能性がある /より高速なディスクは、ログを読んで分離するように、自身が分離するのInnoDBログファイルを移動するいくつかの利点を参照/書き込みを読ん表領域から書き込み、それでも疑問です。バッテリーでバックアップされたキャッシュ(より良いのはSSD)を備えた高速で高品質のRAIDアレイに投資することで、リソースをより有効に活用できます。


バッテリーバックアップキャッシュ-さらに詳しく調べるためのリンクを教えてください。
Katafalkas

まず、en.wikipedia.org / wiki / RAIDから始めるのがよいでしょう。RAID10は、データベースでは一般的にRAID5または6よりも優れています。
アーロンブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.