使用背景
當sql運行比較耗時的時候,可以進行sql優化,比如加索引,調整sql的結構等等,我們看sql運行的狀態等資訊時,可以通過執行計劃來參考,
explain + sql 陳述句查看 執行計劃,
例如:EXPLAIN SELECT * FROM `g_play_log` WHERE `user_id` = '6178962'

?
上圖為sql的執行計劃查詢結果,通過結果可以看到走的是全表查詢(type=ALL),需要涉及到的資料行數643420,這樣查詢的效率不高,可以對表做一個簡單的優化之后,再看看執行劃,因為通過where條件,條件為user_id,可以對user_id建一個索引,建好索引后,再看執行計劃的結果如下,

?
通過兩次的結果對比可以看到,加上索引之后,查詢會走索引(type=ref,key=user_id_index),需要涉及到的資料行數61,這樣查詢的效率會大大的提高,
執行計劃欄位說明
select_type:
SIMPLE(簡單查詢),
PRIMARY(最外層查詢),
SUBQUERY(映射為子查詢),
DERIVED(子查詢),
UNION(聯合),
UNION RESULT(使用聯合的結果)
table : 正在訪問的表名
type:
ALL(全資料表掃描),
index(全索引表掃描),
RANGE(對索引列進行范圍查找),
INDEX_MERGE(合并索引,使用多個單列索引搜索),
REF(根據索引查找一個或多個值),
EQ_REF(搜索時使用primary key 或 unique型別),
CONST(常量,表最多有一個匹配行,因為僅有一行,在這行的列值可被優化器剩余部分認為是常數,const表很快,因為它們只讀取一次),
SYSTEM(系統,表僅有一行(=系統表),這是const聯接型別的一個特例)
說明:性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const(性能在 range 之下基本都可以進行調優)
possible_keys:可能使用的索引
key:真實使用的索引
key_len:MySQL中使用索引位元組長度
rows:mysql 預估為了找到所需的行而要讀取的行數
extra:
Using index
(此值表示mysql將使用覆寫索引,以避免訪問表),
Using where
(mysql 將在存盤引擎檢索行后再進行過濾,許多where條件里涉及索引中的列,當它讀取索引時,就能被存盤引擎檢驗,因此不是所有帶where子句的查詢都會顯示“Using where”,有時“Using where”的出現就是一個暗示:查詢可受益于不同的索引),
Using temporary
(mysql 對查詢結果排序時會使用臨時表),
Using filesort
(mysql會對結果使用一個外部索引排序,而不是按索引次序從表里讀取行,mysql有兩種檔案排序演算法,這兩種排序方式都可以在記憶體或者磁盤上完成,explain不會告訴你mysql將使用哪一種檔案排序,也不會告訴你排序會在記憶體里還是磁盤上完成),
Range checked for each record(index map: N)
(沒有好用的索引,新的索引將在聯接的每一行上重新估算,N是顯示在possible_keys列中索引的位圖,并且是冗余的)
使用索引的情況
1.使用 like 陳述句時,%在右邊才會使用索引,
2.or 條件中有未建立索引的列索引失效,
3.條件的型別不一致索引失效,
4.使用!=時部分情況索引失效,(如果是主鍵,則會走索引)
5.使用>時部分情況索引失效,(如果是主鍵或索引是整數型別,則會走索引)
6.order by部分情況索引失效,(如果 order by 的列是主鍵或索引是整數型別,則會走索引)
7.組合索引(遵循最左前綴)
# 若 name 和 email 組成組合索引 create index ix_name_phone on user(name, phone); # 使用結果 name and phone -- 使用索引 phone and name -- 不使用索引 name -- 使用索引 phone -- 不使用索引
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/238466.html
標籤:其他
上一篇:CentOS 8.2上安裝Cassandra Web部署
下一篇:[翻譯]——MySQL Server Variable: sync_binlog (Doc ID 1501926.1)
