Mysql執行計劃與批量insert語句

執行計劃:

id: 確定sql的執行的先後順序
1、id相同按照從上到下
2、id不同大的優先執行
3、id相同也有id不同、那麼執行順序是先執行id越大的先執行,如果在執行的過程中發現id相同就從上到下執行
select_type:
1、simple: 簡單的sql查詢語句不包含子查詢或者union
2、primary: 如果sql語句包含複雜的sql語句,那麼最外層的sql爲primary
3、subquery:包含子查詢
4、derived: 存在第虛擬表
5、union:
1、出現在select之前
2、union包含在FROM子句的查詢中,外層的select被標記爲derived
6、union result:
取到結果
table
說明表的名字
type
system :說明表中只有只有一行數據
const: 通過索引一次性就能找出來(primary key或者unique索引),
eq_ref: 如果有兩個表做關聯查詢,發現表中只有唯一一行記錄與他匹配。(主鍵或唯一索引掃描)
ref: 如果一個表中一個字段建立了多個複合索引,那麼查詢條件中如果添加了索引列那麼他就是ref索引 (額外的索引列)
range : 查詢天健中代理between、< > in
index : 如果查詢出來的字段都是索引字段。
ALL 如果查詢一張表中的所有字段(存在一個問題就是如果表全部是索引字段那麼查詢出來type = index)
possible_keys 他表示查詢出來可能走的索引
key : 當前sql語句所走的索引
key_len: 當前查詢出來字段所佔用的最大長度,並非實現長度
思考一: 爲什麼mysql執行計劃爲什麼會出現該字段?
1、根據這個值可以判斷索引的使用情況,特別是在組合索引的時候,判斷所有的索引字段是否都是被查詢到的
2、根據編碼不同,他所在內存空間所佔用的字節數各不一樣?
latin佔用一個字節、 gbk:佔用2個字節 、 utf8佔用三個字節
char 和 varchar 在內存中字節空間是如何計算的呢?
1、char :他們爲兩種情況 -——> 一種是當前字段可以存儲null值、 一種是不能存儲null值。
下面分別討論:
not null 計算 ————————> 當前編碼字節所佔的空間
null 計算 ----————————> 當前編碼
字節所佔的空間 + 1
2、varchar 定義char一,唯一不同的就是null與not null在內存中所佔用的空間不一樣
下面分別討論:
not null 計算 ————————> 當前編碼字節所佔的空間 + 2
null 計算 ----————————> 當前編碼
字節所佔的空間 + 1(null) + 2
3、整數/浮點數/時間類型的索引長度
NOT NULL=字段本身的字段長度
NULL=字段本身的字段長度+1(因爲需要有是否爲空的標記,這個標記需要佔用1個字節)

  思考二:mysql他們如何判斷當前選中的類型所佔用的內存空間呢?  
    // mysql

ref:標識哪一個數據庫.表.列 使用了索引 如果當前標記爲const的話那麼他條件後面就是個常量。

rows : 當前掃描出來的行數
extra:
Using filesort: 說明mysql會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。
MySQL中無法利用索引完成的排序操作稱爲“文件排序”
Using temporary 使了用臨時表保存中間結果,MySQL在對查詢結果排序時使用臨時表。常見於排序 order by 和分組查詢 group by
USING index 是否用了覆蓋索引
Using where 表明使用了where過濾
Using join buffer 使用了連接緩存:
Impossible where where子句的值總是false,不能用來獲取任何元組


優化的總結:

1、儘量全值匹配
2、最佳左前綴法則
3、不在索引列上做任何操作
4、範圍條件放最後
5、覆蓋索引儘量用
6、不等於要甚用
7、Null/Not 有影響
8、Like查詢要當心
9、字符類型加引號
10、OR改UNION效率高

上面怎麼理解:
實例: 假如我們有一張學生表(name,age,sex),然後對三個字段添加索引;
1、儘量全值匹配 (背後的故事)
step2:儘量使用name=“xx” and age = “xx” and sex = “xx”
我們爲什麼要使用全值匹配呢?
1、爲了提升效率
2、怎麼判斷當前索引字段使用是否生效呢?
根據 執行計劃中 key_len ref
2、最佳左前綴法則
1、如果我們給name,age,sex建立聯合索引
2、我們在查詢語句中 使用 age =“xx” and sex =“xx” 當前索引失效

3、不在索引列上做任何操作
   1、 不在索引列上做任何操作(計算、函數、(自動or手動)類型轉換)
 
4、	範圍條件放最後
  1、 這個是爲什麼? 因爲範圍查會導致當前索引後面的索引失效

5、覆蓋索引儘量用	

LOAD DATA INFLIE;
使用LOAD DATA INFLIE ,比一般的insert語句快20倍

select * into OUTFILE ‘D:\product.txt’ from product_info

load data INFILE ‘D:\product.txt’ into table product_info

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章