<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • mysql sql語句優化(sql和python的區別講解)


    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等等。

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

    版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。

    發表評論

    登錄后才能評論
    国产精品区一区二区免费