回答:
方法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アレイに投資することで、リソースをより有効に活用できます。