MySql執行順序及執行計划


一、mySql的執行順序

mysql執行sql的順序從 From 開始,以下是執行的順序流程

1、FROM table1 left join table2 on 將table1和table2中的數據產生笛卡爾積,生成Temp1

2、JOIN table2 所以先是確定表,再確定關聯條件

3、ON table1.column = table2.columu 確定表的綁定條件 由Temp1產生中間表Temp2

4、WHERE 對中間表Temp2產生的結果進行過濾 產生中間表Temp3

5、GROUP BY 對中間表Temp3進行分組,產生中間表Temp4

6、HAVING 對分組后的記錄進行聚合 產生中間表Temp5

7、SELECT 對中間表Temp5進行列篩選,產生中間表 Temp6

8、DISTINCT 對中間表 Temp6進行去重,產生中間表 Temp7

9、ORDER BY 對Temp7中的數據進行排序,產生中間表Temp8

10、LIMIT 對中間表Temp8進行分頁,產生中間表Temp9


二、mySql的執行計划

1、什么是執行計划

執行計划就是sql的執行查詢的順序,以及如何使用索引查詢,返回的結果集的行數

2、執行計划的內容

①.id sql執行計划的順序 或子查詢表的執行順序

id一樣,按照順序執行;id越大,執行的優先級就越高(如子查詢)

②.select_type 表示查詢中每個select子句的類型

a.SIMPLE:查詢中不包含子查詢或者UNION

b.查詢中若包含任何復雜的子部分,最外層查詢則被標記為:PRIMARY

c.在SELECT或WHERE列表中包含了子查詢,該子查詢被標記為:SUBQUERY

d.在FROM列表中包含的子查詢被標記為:DERIVED(衍生)

e.若第二個SELECT出現在UNION之后,則被標記為UNION;若UNION包含在 FROM子句的子查詢中,外層SELECT將被標記為:DERIVED

f.從UNION表獲取結果的SELECT被標記為:UNION RESULT

③.type

MySQL在表中找到所需行的方式,又稱“訪問類型”,常見類型如下:

由左至右,由最差到最好

ALL:全表掃描

index:index類型只遍歷索引樹

索引的存在形式是文件,按存儲結構划分):FULLTEXT,HASH,BTREE,RTREE。

對應存儲引擎支持如下:

 

轉載mySql索引:http://blog.csdn.net/jesseyoung/article/details/38037543

range:索引范圍掃描

對索引字段進行范圍查詢,使用in則是使用rang范圍查詢; 使用">" ,"<" 或者 "between" 都是可以使用索引的,但是要控制查詢的時間范圍,一般查詢數據不要超過數據總數的 15%

ref:非唯一性索引

類似 select count(1) from age = '20';

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

④.key

表示在執行語句用到的索引

查詢中若使用了覆蓋索引,則該索引僅出現在key列表中

覆蓋索引:查詢數據只需要通過索引就可以查詢出,如55萬條數據,使用索引,立刻可以查詢出 2000條數據,同時Extra字段是Using index

⑤.Extra

Using index : 使用覆蓋索引的時候就會出現

using index condition:查找使用了索引,但是需要回表查詢數據

Using where :在查找使用索引的情況下,需要回表去查詢所需的數據

using index & using where:查找使用了索引,但是需要的數據都在索引列中能找到,所以不需要回表查詢數據

Using temporary:需要使用臨時表來存儲結果集,常見於排序和分組查詢

Using filesort:無法利用索引完成的排序操作稱為“文件排序”;

很多場景都是索引是一個字段,order by 排序的字段與索引字段不一致,導致的Using fileSort;

此時可以給排序字段和where條件字段,添加為組合索引,同時保證索引查詢的數據不超過總量的15%,避免fileSort

注:回表的含義是,先根據索引查詢數據,然后在根據確定的數據id和查詢條件再去查詢具體的數據的過程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM