sql和python的區別講解「mysql sql語句優化」

SQL執行計劃分析

執行計劃分析在sql調優中佔有舉足輕重的地位,通過Explain+我們自定義的SQL便可得出該SQL的執行計劃,如下:

MySQL進階系列:SQL執行計劃分析及執行方式

我們來分析一下執行計劃中比較重要的幾列:

id列

它是select的序列號,有幾個select就有幾個id,並且id的順序是按select出現的順序增長的。

id列越大執行優先級越高,id相同則從上往下執行,id為NULL最後執行。

table列

即對應select的那個表。

type列

這一列表示SQL的優化程度,依次從最優到最差分別為:system>const>eq_ref>ref>range>index>ALL。一般來說,得保證查詢達到range級別,最好達到ref。

key列

實際走的索引。

rows列

mysql內部估算的結果數或掃描數。

Extra列

這一列展示一些額外信息,重要的信息有以下幾個:

1)Usingindex:表示使用了覆蓋索引(覆蓋索引的意思就是只查詢索引樹上的字段,減少了回表操作,從而提升了速度);

2)Usingwhere:使用where語句來處理結果,並且查詢的列未被索引覆蓋;

3)Usingindexcondition:查詢的列不完全被索引覆蓋,where條件中是一個前導列的範圍;

4)Usingtemporary:mysql需要創建一張臨時表來處理查詢。出現這種情況一般是要進行優化的,首先是想到用索引來優化;

5)Usingfilesort:使用普通字段排序而不是索引排序,數據較小時從內存排序,否則需要在磁盤完成排序。這種情況下一般也是要考慮使用索引來優化的。

SQL在MYSQL中如何執行

要弄懂這個問題,首先我們要搞清楚MYSQL的內部結構,如下:

MySQL進階系列:SQL執行計劃分析及執行方式

SQL執行過程如下:

MYSQL作為服務端,我們的程序作為客戶端通過TCP與MYSQL保持一個長連接。

MYSQL把我們的SQL作為一個key去緩存中查詢(MYSQL的緩存採用的是LRU淘汰算法來實現緩存的淘汰機制的),判斷是否緩存命中。

如命中,則直接返回數據;如未命中,則繼續下面的流程。

MYSQL實現了一套語法分析器(C語言寫的),通過這個分析器來判斷我們SQL語法的正確性。

語法正確之後,再通過內部實現的優化器對我們的SQL進行一些優化,包括成本Cost計算等等(這就是為什麼我們覺得某個SQL理論上會走索引,但是執行計劃顯示卻沒有走索引的原因),最終生成我們SQL的執行計劃。

當然,我們也可以通過FORCE_INDEX(….)強制走索引。

優化完成之後,會進入MYSQL內部的執行器,然後通過執行器調用我們這張表對應的存儲引擎,比如Innodb、 MyISAM、Memory等等。

執行引擎會根據優化器分析出來的結果,也就是通過最優索引去對應的索引樹上找到對應的數據,同時進行索引樹的維護。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/277980.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-19 13:28
下一篇 2024-12-19 13:28

相關推薦

發表回復

登錄後才能評論