mysql卡的調優思路 MySQL效能調優思路

2021-10-20 01:17:37 字數 2703 閱讀 5957

1.mysql效能調優思路

如果一台伺服器出現長時間負載過高 /週期性負載過大,或偶爾卡住如何來處理?

是週期性的變化還是偶爾問題?是伺服器整體效能的問題,還是某單條語句的問題?

具體到單條語句, 這條語句是在等待上花的時間,還是查詢上花的時間?

1.1. 監測並觀察伺服器的狀態.

觀察伺服器狀態, 一般用如下2個命令

show status;

show processlist;

例: mysql> show status;

#mysqladmin ext

1.2. mysql的每秒請求數週期性變化,隨著快取失效,有短時間的高峰

解決辦法:

1: 減少無關請求(業務邏輯層面,暫不討論,但其實是最有效的手段)

2: 如果請求數是一定的,不可減少的.我們要盡量讓請求數平穩,不要有劇烈波動.

很多時候,不是伺服器撐不住總的查詢量,而是在某個時間段撐不住高峰請求.

1.3.對於不規則的延遲現象的觀察

不規則的延遲現象往往是由於效率低下的語句造成的,如何抓到這些效率低的語句.

可以用show processlist命令長期觀察,或用慢查詢.

show processlist;

這個命令是顯示當前所有連線的工作狀態.

#!/bin/bash

while true

domysql -uroot -e 'show processlist\g'|grep state:|uniq -c|sort -rn

echo '---'

sleep 1

done

如果觀察到以下狀態,則需要注意

converting heap to myisam     查詢結果太大時,把結果放在磁碟(語句寫的不好,取資料太多)

create tmp table                         建立臨時表(如group時儲存中間結果,說明索引建的不好)

copying to tmp table on disk   把記憶體臨時表複製到磁碟(索引不好,表字段選的不好)

locked                                         被其他查詢鎖住(一般在使用事務時易發生,網際網路應用不常發生)

logging slow query                   記錄慢查詢

1.4. mysql 5.5 以後加了乙個profile設定,可以觀察到具體語句的執行步驟.

檢視profile是否開啟

show variables like 『profiling』

開啟profile

set profiling=on;

檢視profiles;

show profiles;

檢視profile;

show profile for query 1;

2.如何定位到有問題的語句?

開啟伺服器慢查詢

了解臨時表的使用規則

2.1. mysql如何使用內部臨時表

在處理請求的某些場景中,伺服器建立內部臨時表.即表以memory引擎在記憶體中處理,或以myisam引擎儲存在磁碟上處理.如果表過大,伺服器可能會把記憶體中的臨時表轉存在磁碟上.

使用者不能直接控**務器內部用記憶體還是磁碟儲存臨時表

2.2. 臨時表在如下幾種情況被建立:

如果group by 的列沒有索引,必產生內部臨時表,

如果order by 與group by為不同列時,或多表聯查時order by ,group by包含的列不是第一張表的列,將會產生臨時表

distinct 與order by一起使用可能會產生臨時表

如果使用sql_small_result,mysql會使用記憶體臨時表,除非查詢中有一些必須要把臨時表建立在磁碟上.

union合併查詢時會用到臨時表

某些檢視會用到臨時表,如使用temptable方式建立,或使用union或聚合查詢的檢視

想確定查詢是否需要臨時表,可以用explain查詢計畫,並檢視extra列,看是否有using temporary.

如果一開始在記憶體中產生的臨時表變大,會自動轉化為磁碟臨時表.記憶體中臨時表的最大值為tmp_table_size和max_heap_size中較小值.

這和create table時顯示指定的記憶體表不一樣:這些表只受max_heap_table_size系統引數影響.

當伺服器建立內部臨時表(無論在記憶體還是在磁碟),create_tmp_tables變數都會增加.

如果建立了在磁碟上內部臨時表(無論是初始建立還是由in-memory轉化),

create_tmp_disk_tables 變數都會增加.

一些情況下限制了記憶體臨時表的使用,而使用磁碟臨時表:

(使用了內部臨時表的前提下)語句中存在blob或text列

在group by 或distinct子句中有大於512位元組的string列

在union或union all時,select語句裡有大於512位元組的string列.

建表: 表結構的拆分,如核心欄位都用int,char,enum等定長結構;非核心字段,或用到text,超長的varchar,拆出來單放一張表.

建索引: 合理的索引可以減少內部臨時表(索引優化策略裡詳解)

寫語句: 不合理的語句將導致大量資料傳輸以及內部臨時表的使用.

mysql 調優 Mysql調優

表設計 1 禁止使用外來鍵 2 多表中的相同列,必須保證列定義一致 3 國內表預設使用innodb,表字符集預設使用gbk,國際預設使用utf8的表 4 表必須包含gmt create和gmt modified欄位,即表必須包含記錄建立時間和修改時間的字段 5 單錶一到兩年內資料量超過500w或資料...

MySQL伺服器調優思路

1.mysqladmin uroot ext awk queries threads connected threads running end usr local mysql bin mysqladmin uroot pwangxiaohu ext awk queries threads conn...

tcp網路引數調優思路

1.設定向外連線可用埠範圍 2.設定time wait連線重用 3.設定快速 time wait連線 4.設定time wait的最大連線長度 5.啟用以一種比超時重發更精確的方法來啟用rtt的計算 rtt round trip time 乙個連線的往返時間,即資料傳送時刻到接收到確認的時刻的差值 ...