3

多くのテーブルを持つ mysql データベースがあります。このデータベースは、ますます多くのトラフィックを獲得している Web サイトを強化します。

パフォーマンスのボトルネックとなる結合を意図的に回避するようにデータベースとクエリを設計しました。これにより、特定のテーブルの負荷が大きすぎる場合に必要に応じてテーブルを個別のサーバーに分割できます (後で、個々のテーブルを分割できます)。必要に応じて)。

私の質問はこれです:私が持っているテーブルの数を考えると、どのテーブルとクエリが最も「負荷」を受けているかを検出する簡単な方法はありますか?特に、読み書きの使用率が高いテーブルについて疑問に思っています。

リクエストを分散してリソースを管理するために、どのテーブルを他のサーバーに移動する必要があるかを判断するために (自分のコードとログを見る以外に) 何らかの方法で伝えたいと考えています。私は「ロード」という用語を一般的に使用していますが、おそらく間違っています (?)。

4

2 に答える 2

3

これこそまさに、Percona Toolkit が (他の多くのことの中でも) そのために作られたものです。具体的には、pt-query-digest (リンク)-スロークエリからSQLインジェクションの検出まで、膨大な数のユーティリティに使用できます.

この場合、= 0 を設定することにより、すべてのクエリをファイルに記録するようpt-query-digestに設定する一般的な戦略と一緒に使用できます。これで、すべてのクエリがスロー クエリ ファイルに記録されます (時間を前の値に必ずリセットしてください)。long_query_timeslow_query_loglong_query_time

mysql> SELECT @@GLOBAL.slow_query_log_file;
+------------------------------------------+
| @@GLOBAL.slow_query_log_file             |
+------------------------------------------+
| /var/lib/ubuntu/mysql/slowquery.log            |
+------------------------------------------+
1 row in set (0.00 sec)
mysql> SET GLOBAL slow_query_log_file='/tmp/sniffed_queries.log';
mysql> SET GLOBAL long_query_time = 0; 
mysql> FLUSH LOGS; #Clear the logs

したがって、pt-query-digest で分析するために、一般的なログや別のテーブルをいじることなく、サーバー上で実行されたすべてのクエリの便利なログを取得できます。

pt-query-digest /tmp/sniffed_queries.log 

非常に有用で、初心者にとって興味深い素晴らしい出力が生成されます。

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

# Profile
# Rank Query ID           Response time Calls R/Call Apdx V/M   Item
# ==== ================== ============= ===== ====== ==== ===== ==========
#    1 0x92F3B1B361FB0E5B  4.0522 50.0%   312 0.0130 1.00  0.00 SELECT wp_options
#    2 0xE71D28F50D128F0F  0.8312 10.3%  6412 0.0001 1.00  0.00 SELECT poller_output poller_item
#    3 0x211901BF2E1C351E  0.6811  8.4%  6416 0.0001 1.00  0.00 SELECT poller_time
#    4 0xA766EE8F7AB39063  0.2805  3.5%   149 0.0019 1.00  0.00 SELECT wp_terms wp_term_taxonomy wp_term_relationships
#    5 0xA3EEB63EFBA42E9B  0.1999  2.5%    51 0.0039 1.00  0.00 SELECT UNION wp_pp_daily_summary wp_pp_hourly_summary wp_pp_hits wp_posts
#    6 0x94350EA2AB8AAC34  0.1956  2.4%    89 0.0022 1.00  0.01 UPDATE wp_options
#    7 0x7AEDF19FDD3A33F1  0.1381  1.7%   909 0.0002 1.00  0.00 SELECT wp_options
#    8 0x4C16888631FD8EDB  0.1160  1.4%     5 0.0232 1.00  0.00 SELECT film
#    9 0xCFC0642B5BBD9AC7  0.0987  1.2%    50 0.0020 1.00  0.01 SELECT UNION wp_pp_daily_summary wp_pp_hourly_summary wp_pp_hits
#   10 0x88BA308B9C0EB583  0.0905  1.1%     4 0.0226 1.00  0.01 SELECT poller_item
#   11 0xD0A520C9DB2D6AC7  0.0850  1.0%   125 0.0007 1.00  0.00 SELECT wp_links wp_term_relationships wp_term_taxonomy
#   12 0x30DA85C940E0D491  0.0835  1.0%   542 0.0002 1.00  0.00 SELECT wp_posts
#   13 0x8A52FE35D340A347  0.0767  0.9%     4 0.0192 1.00  0.00 TRUNCATE TABLE poller_time
#   14 0x3E84BF7C0C2A3005  0.0624  0.8%   272 0.0002 1.00  0.00 SELECT wp_postmeta
#   15 0xA01053DA94ED829E  0.0567  0.7%   213 0.0003 1.00  0.00 SELECT data_template_rrd data_input_fields
#   16 0xBE797E1DD5E4222F  0.0524  0.6%    79 0.0007 1.00  0.00 SELECT wp_posts
#   17 0xF8EC4434E0061E89  0.0475  0.6%    62 0.0008 1.00  0.00 SELECT wp_terms wp_term_taxonomy
#   18 0xCDFFAD848B0C1D52  0.0465  0.6%     9 0.0052 1.00  0.01 SELECT wp_posts wp_term_relationships
#   19 0x5DE709416871BF99  0.0454  0.6%   260 0.0002 1.00  0.00 DELETE poller_output
#   20 0x428A588445FE580B  0.0449  0.6%   260 0.0002 1.00  0.00 INSERT poller_output
# MISC 0xMISC              0.8137 10.0%  3853 0.0002   NS   0.0 
<147 ITEMS>

この例から、SELECT...FROM wp_options 呼び出しの R/Call が最大の負荷を引き起こしていることがわかります。他にもお得な情報が盛りだくさんです。mysql に固執する場合は、percona-toolkit を早い段階で頻繁に使用することを強くお勧めします

Percona にはこれに関する優れた記事があります。これは Percona Server MySQL ビルドに関するもので、優れていますが、それでも適用する必要があります。

于 2013-07-20T05:53:11.760 に答える
0

テーブルにトリガーを設定し、トリガーに、操作対象のテーブル名を別の追跡テーブルに挿入させることができます。

このようなトリガーを設定する方法は 2 つあります。

1. トリガーを毎回追跡テーブルに挿入します。追跡テーブルには、操作対象のテーブルの名前が格納されます。次に、追跡テーブルをテーブル名でグループ化することにより、更新の数を集計できます。ここでの問題は、更新ごとに個別の行が必要になることです。

  1. 追跡テーブルにテーブル名とカウントの両方を格納します。次に、必要に応じてトリガーにカウントを更新させます

    SELECT * FROM trackingTable WHERE table_name = 'sometablename';
    IF @@ROWCOUNT == 0 -- sometablename は、trackingTable にまだありません
    BEGIN
    INSERT INTO sometablename VALUES('sometablename, 1); -- テーブルに挿入、count=1
    END
    ELSE
    BEGIN
    DECLARE @count AS INT;
    SET @count = (select thecount FROM trackingTable WHERE table_name = 'sometablename');
    SET @count = @count+1; -- カウントを 1 増やします
    UPDATE trackingTable SET theCount=@count WHERE table_name='sometablename';
    終わり
于 2013-07-20T04:46:00.053 に答える