mysql效能優化簡書 mysql 效能優化

2021-10-17 20:27:29 字數 3096 閱讀 5386

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高效能。在嘗試編寫快速的查詢之前,需要清楚一點,真正重要是響應時間。查詢的生命週期 通常來說,查詢的生命週期大致可以按照順序來看 從客戶端 伺服器 然後再伺服器上進行解析 生成執行計畫 執行 並返回結果給客戶端。其中 執行 可以認為...