MySQL執行順序如下 1.FROM 2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBEor WITH ROLLUP 7.HAVING 8.SELECT 9.DISTINCT 10.ORDER BY 11.TOP / LIMIT 如果想要知道自己SELECT語句的效率如何,可以在SELECT之前加上EXPLAIN 關鍵字 即可得知相關的執行順序及效率分析<此篇不對此做討論> 如上所列查詢語句有其執行的順序,所以要讓自己的查詢語句提昇效率就必須從這上述各點來下手,在此以例子直接說明 SELECT          * FROM          user          JOIN                   userProfile AS pro          ON                   user.id = pro.userId          JOIN                   userAgreement AS agr         ON                   agr.userId = user.id WHERE          user.birthday = '1984-06-25'          AND          pro.local = '員林'  這句SQL執行的順序是 1.FROM    user 2.ON         user.id = pro.userId 3.JOIN      userProfile AS pro 4.ON         agr.userId = user.id 5.JOIN      userAgreement AS agr 6.WHERE user.birthday = '1984-06-25'                   AND                   pro.local = '員林' 7.SELECT * 查詢顧名思義如同在電話簿中找尋某人的名字一樣,資料量越大、所知的條件越少查詢所需時間就越長,相對的資料量越少、知道的條件越明確查詢所需的時間就越短。 那麼在這樣的執行順序下我們要怎麼讓資料量縮小以加快速度呢? 照執行順序來走 1.先碰到的就是user這個table,這個table相對於其他兩個table是否資料量最少?以此例討論的確是如此,因為user對userProfile、userAgreement都是一對多的關係,當然以user當開頭是一個好開頭。 2.接下來限制條件,以明確的條件來限制、以及少量的資料來比對大量的資料,自然就能保持較佳的查詢效率了。 3.有了明確條件以及少量資料比對的限制,JOIN table效率自然會比較好。 4.5.如上兩點所言,越明確的條件以及少量資料的比對,效率會更好,所以這裡值得注意的是ON         agr.userId = user.id  以大量的資料去比對少量的資料,這是反其道而行會適得起反降慢速度,ON   user.id = agr.userId 如果改成這樣就會變成以少量資料去比對大量資料,則又可獲得較佳的效率了。 6.當上述的TABLE都JOIN完成之後,再用WHERE來做整體的條件限制,一直以來都是這麼做的沒錯吧~那就錯大了!!如果條件可以在上面ON的時候就限制,資料量便可再更縮小,JOIN出來的TABLE就會很小甚至精準到需求的資料,有時候根本連WHERE都不用寫,那該怎麼寫呢?稍後將會把改完的SQL寫在下方給大家參考。 7.JOIN完TABLE,限制條件也結束了,才開始SELECT,此時會將使用者所需要的資料一一列出,大家都會用*來簡便的將一切列出,這也是降低效率的兇手之一,SELECT越明確,越少的欄位會讓整體速度稍微加快,因此在SELECT部份也盡量少濫用*,可獲得較佳的效率 透過上述幾點,將修改後的SQL寫出如下︰ SELECT          user.id,          user.username,          pro.phone,          agr.agreementEndDate FROM          user          JOIN                   userProfile AS pro          ON                   user.birthday = '1984-06-25'                   AND                   pro.local = '員林'                   AND                   user.id = pro.userId          JOIN                   userAgreement AS agr          ON                   agr.userId = user.id 如上所示,在第一次ON的條件限制下就將資料量降到最少,甚至精準,如此往後JOIN就會讓資料量大為減少,最後連WHERE都不需要額外限制其他條件,而SELECT部份也只挑出所需的資料就好, 達到最佳的效率 總結︰資料量越小、條件越明確就能達到最好的查詢效率

 

其它文章

文章標籤
全站熱搜
創作者介紹
創作者 PG Levin Li 的頭像
PG Levin Li

程式開發學習之路

PG Levin Li 發表在 痞客邦 留言(0) 人氣(1,244)