內容字號:默認大號超大號

段落設置:段首縮進取消段首縮進

字體設置:切換到微軟雅黑切換到宋體

Mysql服務運行一段時間后就變慢了,怎么查找原因?

2017-10-24 23:29 出處:投稿 人氣: 評論(0

我們的Mysql服務運行一段時間后,不知什么原因就變慢了,怎么查找原因呢?

一、關鍵性指標

在數據庫性能評測中,有幾項指標很重要,用它來評估數據庫的能力,不是他們能起著多么關鍵的作用,而是他們能夠較為明確的代表數據庫在某些方面的能力。

1.IOPS

IOPS:Input/Output operation Per Second, 每秒處理的IO請求次數。
我們知道I/O就是磁盤的讀寫能力,比如每秒讀 300M,寫 200M,這個即數據的吞吐量(I/O能力的另一個關鍵指標),但是 IOPS 指的可不是讀寫的數據吞吐量,IOPS 指的是每秒能夠處理的 I/O 請求次數

如果想I/O 系統響應夠快,那么 IOPS 越高越好,因為IOPS 和硬件有關,所以,要提高IOPS,就目前來看基本只能拼硬件,傳統方案是使用多塊磁盤通過 RAID 條帶后,使 I/O 讀寫能力獲得提升,我們也可以使用固態硬盤SSD來提升IOPS,不過固態硬盤成本可能比較大。

2.QPS

QPS:Query Per Second,每秒請求(查詢)次數。
這個參數非常重要,可以直觀的反映系統的性能,這就像IOPS衡量磁盤每秒鐘能接收多少次請求。

我們可以在MySQL命令行模式下執行 status 命令,返回的最后一行輸出信息中就包含 QPS 指標。

3.TPS

TPS:Transaction Per Second,每秒事務數。
TPS參數MySQL原生沒有提供,如果需要我們自己算,可以利用計算的公式:

TPS = (Com_commit + Com_rollback) / Seconds

這個公式有兩個狀態變量,分別代表提交次數和回滾次數,Seconds 就是我們定義的時間間隔。

二、TPCC測試關鍵性指標

TPCC-MySQL 由Percona基于TPCC規范開發的一套MySQL基準測試程序,我們使用這套工具來測試前面的三個重要指標。

1.TPCC工具安裝及使用

具體的安裝,可以看這這兩篇博文 mysql壓力測試工具tpcc-mysql安裝測試使用,mysql性能測試-tpcc,TPCC更能模擬線上業務。

三、數據庫參數配置優化

如果數據庫參數配置合理,則可以大大的提高運行效率,即最大化利用系統資源。

1.連接相關參數

1.1 max_connections

max_connections:指定 MySQL 服務端最大并發連接數,值得范圍從 1~10 萬,默認值為151.
這個參數非常重要,因為它決定了同時最多能有多少個會話連接到 MySQL 服務。設定該參數時,根據數據庫服務器的配置和性能,一般將參數值設置在 500~2000 都沒太大的問題。

1.2 max_connect_errors

max_connect_errors:指定允許連接不成功的最大嘗試次數,值得范圍從 1~2^64 之間,在 5.6.6 版本默認值是 100。

一定不要忽視這個參數,如果嘗試連接的錯誤數量超過該參數指定值,則服務器就不再允許新的連接,沒錯,就是拒絕連接,盡管 MySQL 仍在提供服務,但無法創建新的連接了。可以使用 FLUSH HOSTS,使狀態清零或重新啟動數據庫服務,不過這個代價太高了,一般不會這么干,所以,這個參數的默認值太小,這里建議將之設置為 10 萬以上的量級

1.3 interactive_timeout 和 wait_timeout

這兩個參數都與連接會話的自動超時斷開有關,前者用于指定關閉交互連接前等待的時間,后者用于指定關閉非交互連接前的等待時間,單位均是秒,默認值均為 28800,即 8 個小時。

1.4 skip-name-resolve

skip-name-resolve:可以將其簡單的理解為禁用 DNS 解析,注意啊,這個是服務端的行為,連接時不檢查客戶端主機名,而只使用IP。如果制定了該參數,那么在創建用戶及授予權限時,HOST 列必須是IP而不能是主機名。建議啟用該參數,對于加快網絡連接有一定的幫助,等于是跳過了主機名的解析。

1.5 back_log

back_log:指定 MySQL 連接請求隊列中存放的最大連接請求數量,在 5.6.6 版本之,默認是 50 個,最大值不超過 65535。在 5.6.6 版本之,默認值為 -1,表示由MySQL自動調節,所謂自行調節其實也有規則,即 50+(max_connections/5)。

該參數主要應對短時間內有大量的連接請求,MySQL 主線程無法及時為每一個連接請求分配(或創建)連接的線程,怎么辦呢,它也不能直接拒絕,于是就將一部分請求放到等待隊列中待處理,這個等待隊列的長度就是 back_log 的參數值,若等待隊列也被放滿了,那么后續的連接請求才會被拒絕。

2.文件相關參數

2.1 sync_binlog

sync_binlog:指定同步二進制日志文件的平率,默認為0.
如果要性能,則指定該參數為0,為了安全起見則指定該參數值為 1.

2.2 expire_logs_day

expire_logs_day:指定設置二進制日志文件的生命周期,超出則將自動被刪除,參數值以天為單位,值得范圍從0~99,默認值是0,建議將該參數設置為 7~14 之間,保存一到兩周就足夠了。

2.2 max_binlog_size

max_binlog_size: 指定二進制日志的大小,值得范圍從 4KB~1GB,默認為 1GB。

3.緩存控制參數

3.1 thread_cache_size

thread_cache_size:指定MySQL為快速重用而緩存的線程數量。值得范圍從 0~16384,默認值為0.
一般當客戶端中斷連接后,為了后續再有連接創建時,能夠快速創建成功,MySQL 會將客戶端中斷的連接放入緩存區,而不是馬上中斷釋放資源。這樣當有新的客戶端請求連接時,就可以快速創建成功。因此,本參數最好保持一定的數量,建議設置在 300~500 之間均可.另外,線程緩存的命中率也是一項比較重要的監控指標,計算規則為(1-Threads_created/Connections)* 100%,我們可以通過該指標來優化和調整thread_cache_size參數。

3.2 query_cache_type

sql_cache意思是說,將查詢結果放入查詢緩存中。
sql_no_cache意思是查詢的時候不緩存查詢結果。
sql_buffer_result意思是說,在查詢語句中,將查詢結果緩存到臨時表中。

這三者正好配套使用。sql_buffer_result將盡快釋放表鎖,這樣其他sql就能夠盡快執行。

使用 FLUSH QUERY CACHE 命令,你可以整理查詢緩存,以更好的利用它的內存。這個命令不會從緩存中移除任何查詢。FLUSH TABLES 會轉儲清除查詢緩存。
RESET QUERY CACHE 使命從查詢緩存中移除所有的查詢結果。

那么mysql到底是怎么決定到底要不要把查詢結果放到查詢緩存中呢?

是根據query_cache_type這個變量來決定的。

這個變量有三個取值:0,1,2,分別代表了off、on、demand
mysql默認為開啟 on

意思是說,如果是0,那么query cache 是關閉的。
如果是1,那么查詢總是先到查詢緩存中查找,即使使用了sql_no_cache仍然查詢緩存,因為sql_no_cache只是不緩存查詢結果,而不是不使用查詢結果。

select count(*) from innodb;
1 row in set (1.91 sec)
 
select sql_no_cache count(*) from innodb;
1 row in set (0.25 sec)

如果是2,DEMAND。
在my.ini中增加一行
query_cache_type=2
重啟mysql服務

select count(*) from innodb;
1 row in set (1.56 sec)
 
select count(*) from innodb;
1 row in set (0.28 sec)

沒有使用sql_cache,好像仍然使用了查詢緩存

select sql_cache count(*) from innodb;
1 row in set (0.28 sec)

使用sql_cache查詢時間也一樣,因為sql_cache只是將查詢結果放入緩存,沒有使用sql_cache查詢也會先到查詢緩存中查找數據

結論:只要query_cache_type沒有關閉,sql查詢總是會使用查詢緩存,如果緩存沒有命中則開始查詢的執行計劃到表中查詢數據。

相關欄目

相關文章



分享給小伙伴們:

評論

發表評論愿您的每句評論,都能給大家的生活添色彩,帶來共鳴,帶來思索,帶來快樂。

簽名: 驗證碼: 點擊我更換圖片

評論列表

    © 2002-2017 dngsw.cn 電腦高手網 版權所有

    粵ICP備13005586號-3

    26选5开奖