1、伺服器層面:引數配置優化、減少客戶端使用連線數 --可考慮使用快取
2、架構層面:」讀寫分離、分庫、分表、分片
3、業務sql層面:檢視慢查詢日誌、sql優化
show variables like '%slow_query%'; ---預設關閉
檢視日誌路徑
show variables like '%long_query%'; ---多長時間是慢查詢呢?
慢查詢時間設定
怎麼修改預設配置?
vim /etc/my.cnf
linux 檔案路徑
修改引數
檢視最慢的10條sql日誌
mysql -u root -p
show full processlist; ---檢視客戶端鏈結
檢視客戶端鏈結
show global status;---檢視服務端狀態值
show engine innodb status;-- 檢視innodb狀態
innodb執行狀態、檢視死鎖io等
explain執行順序怎麼看?
id值不同 按id從大到小執行
id值相同,從上到下執行
總節:id查詢順序,先從大到小,再從上到下。調整表順序,可得到不同id執行順序。優化原則,小表驅動大表,即小表放前面
一、具體案例
我們來執行一條非常簡單的**:
expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;
執行之後的結果如下:
發現出來了很多的字段,這麼多欄位其實也沒必要每個都重點關注,上面用紅色框框標出了5個字段,這些是需要重點關注的。下面具體來說說這5個字段的含義。
1.type
表示訪問表的方式,一共有6種。
從最好到最差的結果依次如下:
system > const > eq_ref > ref > range > index > all
注意:乙個好的sql語句至少要達到range級別!杜絕出現all級別。
system: 表示結果集僅有一行;
const: 表示通過主鍵或者唯一鍵鍵查詢資料時只匹配最多一行資料;
eq_ref: 該型別多出現在多表join場景,通過主鍵或者唯一鍵訪問表;
對於前表b的每行記錄,都只能匹配到後表a的一行記錄並且查詢的比較操作通常是=,查詢效率較高。
ref: 此型別通常出現在sql使用非唯一或非主鍵索引, 或者是使用最左字首規則索引的查詢;
range: 表示where條件使用索引範圍查詢,當 type 是 range 時,ref 欄位為 null。
index: 表示全索引掃瞄, 掃瞄所有的索引記錄, 而不掃瞄資料;
index 型別通常會出現在覆蓋索引中,所要查詢的資料直接在索引中就可以訪問, 而不用回表掃瞄資料. 此時extra 字段 會顯示 using index。
還有一種是全表掃瞄時通過索引順序訪問資料。此時並不會在extra提示 using index。
all: 表示執行計畫選擇全表掃瞄,當執行計畫出現type 為all 時,我們盡量通過修改索引的方式讓查詢利用索引。
2.key
此字段是 mysql 在當前查詢時所真正使用到的索引。
如果沒有選擇索引,值是null。
可以採取強制索引方式。
3.key_len
key_len表示執行計畫所選擇的索引長度有多少位元組,通常我們可藉此判斷聯合索引有多少列。
key_len 大小的計算規則是:
一般地,key_len 等於索引列型別位元組長度,例如int型別為4 bytes,bigint為8 bytes;
如果是字串型別,還需要同時考慮字符集因素,例如:char(30) utf8則key_len至少是90 bytes;
若該列型別定義時允許null,其key_len還需要再加 1 bytes;
若該列型別為變長型別,例如 varchar(text\blob不允許整列建立索引,如果建立部分索引也被視為動態列型別),其key_len還需要再加 2 bytes。
4.rows
表示的是掃瞄行數。
記住:該值是個預估值,所以並非是完全準確的值。
mysql 查詢優化器根據統計資訊,估算 sql 要查詢到結果集需要掃瞄讀取的資料行數。
原則上 rows 越少越好。
5.extra
該列會提示優化執行計畫的額外的資訊。
注意,常見的不太友好的、值得大家關注的有如下幾種:
using index。表示該sql利用覆蓋索引掃瞄,也即從只訪問索引即可獲取到所需的資料,而不用回表。
using where。表示該sql 回表獲取資料了。什麼是回表呢? 其實就是僅僅通過訪問索引不能滿足獲取所需的資料,需要訪問表的page 頁。
如果和using index 同時出現,說明where條件通過索引定位資料,然後回表,再過濾所需要的資料。
using filesort。說明排序沒有利用索引而發生了額外排序 ,伴隨著的可能還有using temporary。
其實還有其它一些 提示using mrr、using index condition 、using index for group-by,這些提示是正向的,說明sql比較優化。
extra
6.其它字段
前面講了5個比較重要的字段,相信很多求知慾強的小夥伴也想知道其它欄位是什麼意思,這裡也一並列出來,以供參考:
字段含義
id查詢語句的序號或者說是識別符號
select_type表示查詢的型別,常見的有如下6種
table其值為表名或者表的別名,表示訪問哪乙個表
partitions匹配的分割槽
possible_keys表示查詢時,可能使用的索引
filtered按表條件過濾的行百分比 越高越好,越高表示返回給server層資料越準確,100表示server層無需再過濾,減少效能消耗
explain欄位含義
explain format=json select * from schn_shop_goods order by goods_id;---加上format=json 可得到更詳細資訊入cost成本資料等
常見優化
深頁查詢
-----後續具體案例再新增
中文參考文件
mysql效能優化簡書 MySQL效能優化
1 合理的建立及使用索引,索引不宜過多,過多的索引會占用更多的空間,而且每次增 刪 改操作都會重建索引。2 合理的冗餘字段 盡量建一些大表,考慮資料庫的三正規化和業務設計的取捨 3 select語句中盡量不要使用 count 從表中讀取越多的資料,查詢會變得更慢,因為它會增加了磁碟操作時間和資料網路...
mysql 效能優化簡述
用 explain 分析sql語句。使用max 函式時,給max的字段加索引來優化 把子查詢優化為連表查詢,但要注意有重複資料 優化limit技巧 1.使用有索引的列或主鍵進行order by 2.記錄上一次返回的最大id用where id last max id 來過濾資料 關於索引欄位的優化 出...
mysql效能優化簡單步驟
只有當查詢優化,索引優化,庫表結構優化齊頭並進時,才能實現mysql高效能。在嘗試編寫快速的查詢之前,需要清楚一點,真正重要是響應時間。查詢的生命週期 通常來說,查詢的生命週期大致可以按照順序來看 從客戶端 伺服器 然後再伺服器上進行解析 生成執行計畫 執行 並返回結果給客戶端。其中 執行 可以認為...