天天看點

MySQL 執行計劃

MySQL 執行計劃
MySQL 執行計劃

表示找到所查詢資料的方法,該屬性的常見值如下,性能從好到差:

MySQL 執行計劃
MySQL 執行計劃

1.添加索引的時候,要根據MySQL解析順序添加索引

2.最佳做字首,保持索引的定義和使用的順序一緻性

3索引需要逐漸優化(每次建立新索引,根據情況需要删除以前的廢棄索引)

4.将含In的範圍查詢,放到where條件的最後,防止失效。

5.兩張表,對于表連接配接,小表驅動大表。索引建立在經常使用的字段上。

6.三表優化 大于等于張表,優化原則一樣。小表驅動大表,索引建立在經常查詢的字段上

① 複合索引需要注意的點

      a.複合索引,不要跨列或無序使用(最佳左字首);

     b.複合索引,盡量使用全索引比對,也就是說,你建立幾個索引,就使用幾個索引;

② 不要在索引上進行任何操作(計算、函數、類型轉換),否則索引失效

③ 索引不能使用不等于(!= <>)或is null (is not null),否則自身以及右側所有全部失效(針對大多數情況)。複合索引中如果有>,則自身和右側索引全部失效。

④ SQL優化,是一種機率層面的優化。至于是否實際使用了我們的優化,需要通過explain進行推測。

⑤ 索引覆寫,百分之百沒問題

⑥ like盡量以“常量”開頭,不要以’%'開頭,否則索引失效

⑦ 盡量不要使用類型轉換(顯示、隐式),否則索引失效

⑧ 盡量不要使用or,否則索引失效

1)exists和in的優化

如果主查詢的資料集大,則使用i關鍵字,效率高。

如果子查詢的資料集大,則使用exist關鍵字,效率高。

select ..from table where exist (子查詢) ;

select ..from table where 字段 in (子查詢) ;

2)order by優化

IO就是通路硬碟檔案的次數。

using filesort 有兩種算法:雙路排序、單路排序(根據IO的次數)

MySQL4.1之前預設使用雙路排序;雙路:掃描2次磁盤(1:從磁盤讀取排序字段

,對排序字段進行排序(在buffer中進行的排序)2:掃描其他字段)

MySQL4.1之後預設使用單路排序:隻讀取一次(全部字段),在buffer中進行排序。但種單路排序會有一定的隐患(不一定真的是“單路/1次IO”,有可能多次IO)。原因:如果資料量特别大,則無法将所有字段的資料一次性讀取完畢,是以會進行“分片讀取、多次讀取”。

注意:單路排序 比雙路排序 會占用更多的buffer。

單路排序在使用時,如果資料大,可以考慮調大buffer的容量大小:

# 不一定真的是“單路/1次IO”,有可能多次IO

set max_length_for_sort_data = 1024

  如果max_length_for_sort_data值太低,則mysql會自動從 單路->雙路(太低:需要排序的列的總大小超過了max_length_for_sort_data定義的位元組數)

① 提高order by查詢的政策:

a.選擇使用單路、雙路 ;調整buffer的容量大小;

b.避免使用select * …(select後面寫所有字段,也比寫*效率高)

c.複合索引,不要跨列使用 ,避免using filesort

d.保證全部的排序字段,排序的一緻性(都是升序或降序)

繼續閱讀