Mysql 優化 調優

2021-09-29 22:53:55 字數 3184 閱讀 7090

一、慢查詢日誌

慢查詢日誌是在整個庫上做一定的慢執行sql抓取

(1)設定開啟:set global slow_query_log = 1;   # 預設未開啟,開啟會影響效能,mysql重啟會失效

(2)檢視日誌路徑和是否開啟:show variables like '%slow_query_log%';

(3)設定閾值:set global long_query_time=3; # 執行3秒上的加入慢查詢日誌

(4)檢視閾值:show variables like 'long_query_time%';  # 需要重連或新開乙個會話

檢視慢查詢日誌記錄數:show global status like '%slow_queries%';

進入路徑檢視日誌

二、執行計畫分析有了查詢慢的sql後就需要進行執行計畫的分析

explain可以模擬優化器執行sql查詢語句,語法:explain + sql

id:反映的是表的讀取的順序,或查詢中執行select子句的順序。

id相同,執行順序從上至下

id不同,執行順序由大到小

select_type:反映的是(子)查詢型別

******:簡單的select查詢,查詢中不包含子查詢或union。

primary: 複雜查詢最外層

subquery: 除了from之外的子查詢

derived: from中包含的子查詢,也叫做派生表,會將查詢結果放入臨時表

union: union連線的兩個select查詢 這是標記第二個select ,如果union在from裡,第乙個union會被標記為derived,最外層為primary

union result:不需要參與查詢 union結果集

table:反映這一行資料是關於哪張表的

type:連線型別

查詢效率: system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index >all

system: 表中只有一行資料或者是空表,只能用於myisam和memory表。 如果是innodb引擎表,type列在這個情況通常都是all或者index,這是const型別的特例,一般不會出現

const:查詢條件用到了常量,通過索引一次就找到,常在使用primary key或unique索引**現。

eq_ref:唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配,常見於主鍵或唯一索引掃瞄。

ref:非唯一性索引掃瞄,返回匹配某個單獨值的所有行

range: 這個連線型別使用索引返回乙個範圍中的行,比如使用》,

index: index型別只遍歷索引樹,通常比all快

all: 全表掃瞄

possible_keys:可能用到的索引

key: 實際用到的索引

key_len: 索引長度

ref:反映哪些列或常量被用於查詢索引列上的值

rows: mysql所認為的它在找到正確的結果之前必須掃瞄的記錄數

filtered:這個字段表示儲存引擎返回的資料在server層過濾後,剩下多少滿足查詢的記錄數量的比例

extra: 連線查詢的一些資訊:

using filesort:mysql中無法利用索引完成排序,這時會mysql需要進行額外的步驟來發現如何對返回的行排序,建立索引時就會對資料先進行排序,出現using filesort一般是因為order by後的條件導致索引失效,最好進行優化,order by的排序最好和所建索引的順序和個數一致

using temporary: mysql在對查詢結果排序時使用臨時表,這通常發生在對不同的列集進行order by上

using index: 表示相應的select操作中使用了覆蓋索引,避免訪問了表的資料行,效率好

using where: 使用了where

not exists: 優化了left join,一旦它找到了匹配left join標準的行,就不再搜尋了

三、避免索引失效

列舉了一些索引失效和避免索引失效的注意點:

查詢從索引的最左前列開始並且不跳過索引中的列,中間跳過的值,後面的索引會失效

索引列上做了計算、函式,會導致索引失效而轉向全表掃瞄

索引會對範圍生效,但是範圍條件右邊會失效

減少select *,盡量使用覆蓋索引

mysql在使用不等於(!= 或 <>)時無法使用索引,is null,is not null也無法使用索引

like避免使用%%查詢,全模糊。不會走索引。而半模糊 「123%」後面帶%會走索引,通過覆蓋索引可以解決like '%字串%'索引失效的問題

字串不加單引號索引失效

排序必須根據索引順序

對於常量型別,查詢優化器會自動調優sql,順序不影響

左連線把索引建在從表的關聯字段比較好,主表一定會有,從表才是檢索的關鍵,join語句中被驅動表上join條件欄位加索引可以提高效率

count(*) 加上條件會變慢。

mysql 調優 Mysql調優

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

mysql語句的優化(調優)

1 單條查詢最後新增 limit 1,停止全表掃瞄 否則,若無索引,將會查的太多 2 where子句中不要使用 否則放棄索引全表掃瞄。3 盡量避免 null 值判斷,否則放棄索引全表掃瞄。優化前 select number from t1 where number is null 優化後 selec...

mysql調優之schema優化

mysql的三正規化 1nf 第一正規化 字段不可分 2nf 第二正規化 有主鍵,非主鍵字段依賴主鍵 3nf 第三正規化 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf 每列都與主鍵有直接關係,不存在傳遞依賴 在企業中...