本文參考:
一. mysql優化思路:
1.週期性的故障
1).訪問高峰或快取崩潰:增加快取,並修改快取失效策略,失效時間分散
2.通過show processlist 或者 開啟慢查詢日誌,獲取有問題的sql
profiling 和 explain 分析sql語句
1).sql語句等待時間長:對伺服器引數優化,增加緩衝區和執行緒數
2).sql語句執行時間長: 優化sql,建立並優化索引,優化表結構
3.增加硬體裝置,新增集群數量
二. 獲取需要優化的 sql 語句
1.通過show processlist命令,檢視state的值,出現如下值時需要優化。
converting heap to myisam # 查詢結果太大時,把結果放到磁碟,嚴重2.開啟慢查詢日誌create tmp table #建立臨時表,嚴重
copying to tmp table on disk #把記憶體臨時表複製到磁碟,嚴重
locked #被其他查詢鎖住,嚴重
loggin slow query #記錄慢查詢
sorting result #排序
在配置檔案 my.cnf 中的 [mysqld] 一行下邊新增
slow_query_log = 1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time = 2
log_queries_not_using_indexes = 1
其中,slowquerylog = 1 表示開啟慢查詢;slowquerylogfile 表示慢查詢日誌存放的位置; longquerytime = 2 表示查詢 >=2 秒才記錄日誌;logqueriesnotusing_indexes = 1 記錄沒有使用索引的 sql 語句。
注意:slowquerylog_file 的路徑不能隨便寫,否則 mysql 伺服器可能沒有許可權將日誌檔案寫到指定的目錄中。建議直接複製上文的路徑。
雖然在慢查詢日誌中記錄查詢慢的 sql 資訊,但是日誌記錄的內容密集且不易查閱。因此,我們需要通過工具將 sql 篩選出來。
mysql 提供 mysqldumpslow 工具對日誌進行分析。我們可以使用 mysqldumpslow --help 檢視命令相關用法。
-s:排序方式,後邊接著如下引數
c:訪問次數
l:鎖定時間
r:返回記錄
t:查詢時間
al:平均鎖定時間
ar:平均返回記錄書
at:平均查詢時間
-t:返回前面多少條的資料
-g:翻遍搭配乙個正規表示式,大小寫不敏感
案例:獲取返回記錄集最多的10個sqlmysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log
獲取訪問次數最多的10個sqlmysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log
獲取按照時間排序的前10條裡面含有左連線的查詢語句mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log
三. 分析sql語句
1.explain方式分析:
1) id:select 查詢序列號。id相同,執行順序由上至下;id不同,id值越大優先順序越高,越先被執行
2) select_type:查詢資料的操作型別,其值如下:
******:簡單查詢,不包含子查詢3) table:顯示該行資料是關於哪張表unionprimary:包含複雜的子查詢,最外層查詢標記為該值
subquery:在 select 或 where 包含子查詢,被標記為該值
derived:在 from 列表中包含的子查詢被標記為該值,mysql 會遞迴執行這些子查詢,把結果放在臨時表
union:若第二個 select 出現在 union 之後,則被標記為該值。若 union 包含在 from 的子查詢中,外層 select 被標記為 derived
union result:從 union 表獲取結果的 select
4) partitions:匹配的分割槽
5) type:表的連線型別,其值,效能由高到底排列如下:
system:表只有一行記錄,相當於系統表注:前5種情況都是理想情況的索引使用情況。通常優化至少到range級別,最好能優化到 refconst:通過索引一次就找到,只匹配一行資料
eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配。常用於主鍵或唯一索引掃瞄
ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行。用於=、< 或 > 操作符帶索引的列
range:只檢索給定範圍的行,使用乙個索引來選擇行。一般使用between、>、《情況
index:只遍歷索引樹
all:全表掃瞄,效能最差
6) possible_keys:指出 mysql 使用哪個索引在該錶找到行記錄。如果該值為 null,說明沒有使用索引,可以建立索引提高效能
7) key:顯示 mysql 實際使用的索引。如果為 null,則沒有使用索引查詢
8) key_len:表示索引中使用的位元組數,通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好 顯示的是索引欄位的最大長度,並非實際使用長度
9) ref:顯示該錶的索引字段關聯了哪張表的哪個字段
10) rows:根據表統計資訊及選用情況,大致估算出找到所需的記錄或所需讀取的行數,數值越小越好
11) filtered:返回結果的行數佔讀取行數的百分比,值越大越好
12) extra: 包含不合適在其他列中顯示但十分重要的額外資訊,常見的值如下:
using filesort:說明 mysql 會對資料使用乙個外部的索引排序,而不是按照表內的索引順序進行讀取。出現該值,應該優化 sql
using temporary:使用了臨時表儲存中間結果,mysql 在對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢 group by。出現該值,應該優化 sql
using index:表示相應的 select 操作使用了覆蓋索引,避免了訪問表的資料行,效率不錯
using where:where 子句用於限制哪一行
四. 優化手段
1) 避免 select *,需要什麼資料,就查詢對應的字段。
2) 小表驅動大表,即小的資料集驅動大的資料集。如:以 a,b 兩表為例,兩表通過 id 字段進行關聯。
3) 一些情況下,可以使用連線代替子查詢,因為使用 join,mysql 不會在記憶體中建立臨時表。
4) 適當新增冗餘字段,減少表關聯。
5) 合理使用索引(下文介紹)。如:為排序、分組字段建立索引,避免 filesort 的出現。
2.1 適合使用索引的場景
1) 主鍵自動建立唯一索引
2) 頻繁作為查詢條件的字段
3) 查詢中與其他表關聯的字段
4) 查詢中排序的字段
5) 查詢中統計或分組字段
2.2 不適合使用索引的場景
1) 頻繁更新的字段
2) where 條件中用不到的字段
3) 表記錄太少
4) 經常增刪改的表
5) 欄位的值的差異性不大或重複性高
2.3 索引建立和使用原則
1) 單錶查詢:哪個列作查詢條件,就在該列建立索引
2) 多表查詢:left join 時,索引新增到右表關聯字段;right join 時,索引新增到左表關聯字段
3) 不要對索引列進行任何操作(計算、函式、型別轉換)
4) 索引列中不要使用 !=,<> 非等於
5) 索引列不要為空,且不要使用 is null 或 is not null 判斷
6) 索引欄位是字串型別,查詢條件的值要加''單引號,避免底層型別自動轉換
違背上述原則可能會導致索引失效,具體情況需要使用 explain 命令進行檢視
2.4 索引失效情況
除了違背索引建立和使用原則外,如下情況也會導致索引失效:
1) 模糊查詢時,以 % 開頭
2) 使用 or 時,如:欄位1(非索引)or 欄位2(索引)會導致索引失效。
3) 使用復合索引時,不使用第乙個索引列。
index(a,b,c) ,以欄位 a,b,c 作為復合索引為例:
MYSQL效能檢測和優化
首先是如何檢查sql的效率.1.善用explain 設計sql後,應使用explain命令檢查sql,看是否使用到索引,是否存在filesort,重點檢查檢索的行數 rows 是否太大。一般來說.rows 1000,是在可接受的範圍內的。rows在1000 1w之間,在密集訪問時可能導致效能問題,但...
mysql索引及效能優化
索引就是資料結構,通過這種資料結構可以大大提高mysql的查詢效率當表中的資料量越來越大時,索引對於效能的影響愈發重要。索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高好幾個數量級。有了索引相當於我們給資料庫的資料加了目錄一樣,可以快速的找到資料,如果不適用索引則需要一點一點去...
Mysql 效能優化及問題
檢視 max allowed packet show variables like max allowed packet 以下內容為 mysql根據配置檔案會限制server接受的資料報大小。有時候大的插入和更新會被max allowed packet 引數限制掉,導致失敗。檢視目前配置 varia...