mysql通過explain命令輸出執行計畫,對要執行的查詢在這裡插入描述進行分析。
執行計畫的限制
無法展示儲存過程,觸發器,udf(自定義函式)對查詢的影響
無法使用explain對儲存過程進行分析
早期版本的mysql只支援對select語句進行分析,如果想要分析update,insert語句需要將它們通過某種手段轉換成select語句。
一、解釋執行計畫中explain
關鍵注意select_type,type,possible_keys,key,extra
union,第二個select出現在union之後,被標記為該值;union包含在from的子查詢中,外層select被標記為derived;union result,從union表獲取結果的select;
eq_ref,唯一性索引掃瞄,對於每個索引鍵,表中只有一條記錄與之匹配,常用語主鍵或唯一索引掃瞄; ref,非唯一性索引掃瞄,返回匹配某個單獨值的所有行,用於=、《或》操作符帶索引的列;
前5種情況都是理想的索引的情況。通常優化至少到range級別,最好能優化到ref。
(3)possible_keys :指出 mysql 使用哪個索引在該錶找到行記錄。如果該值為 null,說明沒有使用索引,可以建立索引提高效能)
(4)key :顯示 mysql 實際使用的索引。如果為 null,則沒有使用索引查詢
(5)key_len:表示索引中使用的位元組數,通過該列計算查詢中使用的索引的長度。在不損失精確性的情況下,長度越短越好顯示的是索引欄位的最大長度,並非實際使用長度;
(6)ref:顯示該錶的索引字段關聯了哪張表的哪個字段;
(7)extra:包含不適合在其他列中顯示但十分重要的額外資訊。(1)alter table tbl_name add primary key (column_list): 該語句新增乙個主鍵,這意味著索引值必須是唯一的,且不能為null。
(2)alter table tbl_name add unique index_name (column_list): 這條語句建立索引的值必須是唯一的(除了null外,null可能會出現多次)。
(3)column_list): 新增普通索引,索引值可出現多次。
(4)alter table tbl_name add fulltext index_name (column_list):該語句指定了索引為 fulltext ,用於全文索引。
例如:總結:
聯合索引:alter table t add index c1234(c1,c2,c3,c4);
索引的最左原則(左字首原則),如(c1,c2,c3,c4…cn)的聯合索引,where 條件按照索引建立的字段順序來使用(and欄位順序無關),使用like時,條件列屬於聯合索引中間某列就不能使用索引,比如(
explan select * from t where c3 like 『1』;
直接使用c3是全表查詢,無法使用該索引的,所以c3欄位使用 索引的前提是c1,c2兩字段均使用了索引。
explan select * from t where c1 = 『1』 and c4 >『0』 and c3 = 『1』;
c2欄位沒有使用索引,c2之後的字段都不能使用索引
)索引也能用於分組和排序,分組要先排序,在計算平均值等等。所以在分組和排序中,如果字段順序可以按照索引的字段順序,即可利用索引的有序特性
聯合索引的使用規則參考shuo
sql優化文件
mysql優化總結
如果大家有異議,可以在後面補充。我會隨時更新的。現在大概列出如下 望各位補充 1.資料庫的設計 盡量把資料庫設計的更小的佔磁碟空間.1 盡可能使用更小的整數型別.mediumint就比int更合適 2 盡可能的定義欄位為not null,除非這個字段需要null.這個規則只適合欄位為key的情形 3...
mysql優化總結
1 資料庫設計 滿足三大正規化 第一正規化 列的原子性 第二正規化 確保表中的每列都和主鍵相關,乙個表只能儲存一類資料,不能放多類的資料,第三正規化 確保同一行資料不存在傳遞關係 2 資料庫建表 1 儲存引擎選擇 需要支援事務 外來鍵 更新和查詢都很頻繁的使用innodb,如果要使用全文索引 資料更...
mysql優化總結
1.索引優化 1 1 資料大並且查詢多的地方使用索引 1 2 注意復合索引的最左原則 2.盡量不使用子查詢,用連線 join 去替換子查詢 3.連線表的時候,有篩選連表條件的在on加上 4.對結果集沒影響的情況下,選擇最小的表做驅動表 5.where條件排序應遵循乙個原則 排除越多的條件放在第乙個 ...