2013-07-20 37 views
3

我有一個包含許多表的mysql數據庫。這個數據庫提供了一個越來越流量的網站。從查詢使用情況和查詢類型頻率測量MySQL「負載」

我設計了我的數據庫和查詢,以故意避免會造成性能瓶頸的連接,以便我可以根據需要將表分配到單獨的服務器,特定表中的負載過重(稍後,我可根據需要分割各個表)。

我的問題是這樣的:給定我有的表的數量,是否有一個簡單的方法來檢測哪個表和查詢接收到最多的「負載」:我特別想知道具有高讀寫使用率的表。

我想通過某種方式(除了查看我的代碼和日誌)確定哪些表應該移動到其他服務器來分發請求和管理資源。我通常使用「加載」這個術語,也許不正確(?)。

謝謝!

回答

3

這也恰恰是Percona的工具包是爲取得(以及很多很多其他的事情)。具體來說,pt-query-digestLink) - 您可以將其用於大量的實用程序,從慢查詢到檢測SQL注入。

在這種情況下pt-query-digest可以隨着你的設定通過long_query_time設置long_query_time = 0。現在,記錄所有查詢到slow_query_log文件的總體戰略中使用,所有查詢記錄到慢查詢文件(一定要重置時間prev值)。

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-查詢消化來分析:

pt-query-digest /tmp/sniffed_queries.log 

會產生大輸出即extrement有用,您感興趣的用於起動器:

# 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> 

從這個例子可以看到,對於在R /呼叫SELECT ... FROM wp_options調用導致最大的負載。有很多很棒的其他信息。 我會極力推薦早期經常使用的Percona的工具包,如果你要堅持使用MySQL的 - 我把它們趕走了很遠很遠太長,仍然踢自己的,他們就可以防止頭痛。

的Percona對這個偉大的文章,這是對他們的Percona服務器的MySQL構建,這是優秀的,但應該仍然適用:Identifying the load with the help of pt-query-digest and Percona Server

+0

我還沒有嘗試過你的解決辦法,但我看着它,它似乎它會做我想要的。接受答案! – Tucker

+0

哇!似乎它是我見過的最好的配置文件工具,並且關於如何使用它的詳細答案非常完美!你讓我開心!謝謝! – user3479125

0

您可以在表格上設置觸發器,並讓觸發器將正在操作的表格名稱插入到單獨的跟蹤表格中。

我可以看到建立這種觸發器的兩種方法。

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';
    END