1. 程式人生 > >資料庫查詢優化引擎可以怎樣實現查詢優化---物理查詢優化

資料庫查詢優化引擎可以怎樣實現查詢優化---物理查詢優化

前一節介紹了邏輯優化,包括語義上的優化等,體現在等價的結果集的基礎上,是的執行時間最短,使用建立索引的條件查詢來實現等。這節就開始從物理的層面優化,物理層面的優化就體現在演算法,以及索引。

單標掃描演算法

這裡的掃描演算法也是需要結合索引來說,如果沒有建立索引,查詢執行計劃的時候就出現seqscan,如果建立了索引就出現indexscan。這裡單表掃描重點在於常用的全表掃描以及區域性掃描,索引掃描,行掃描,並行表掃描,組合索引掃描等,相關的含義可以參考書中的46頁有詳細額介紹,但是背書的環節只會在面試上用到,所以瞭解即可。下面重點關注索引,有關索引,作者是花了整整一章的來描述,可見其重要性。

索引

索引是為了減少IO的操作,實現更快的獲取資料。一般常見的使用方式是,索引作為條件出現在WHERE ,ON ,HAVING, ORDERBY等,但是如果出現ORDERBY出現的非索引列,這時候還是seqscan來執行。或者作為連線表出現到過濾條件中。但是如果遇到!= 這種不等於操作的時候,這時候順序掃描就比索引掃描效能要好。但是如果使用索引出現在GROUPBY的條件中,不會觸發索引。同樣DISTINCT的執行也是不會執行索引。

兩表連線演算法

兩表連線的時候,優化器執行的是巢狀連線演算法,基於元組塊實現巢狀,一般分為巢狀迴圈連線,歸併連線,Hash連線。簡單介紹到這裡,只要是需要知道兩表的連線是如何產生巢狀即可。

多表連線的順序

基本這個是反映了查詢計劃的形態,分為左深樹,右深樹,緊密樹,而根據生成的樹,提出了很多演算法,比如由上到下的,由底向上的。其中最常用的演算法就是 動態規劃,這個含義在之前的文章也有介紹,現在回顧一下就是在**規則出活動最優方案,然後基於這個最優的方案的狀態決策出最優解。往往都是通過把問題分解成N個子問題,然後通過獲取每個子問題的最優解,依次的歸併到最後一個子問題,最後這個子問題的解就是最開始的問題的解。PG就是使用這種演算法做優化處理。
除了這個動態規劃之外還有一個就是
貪心演算法,每次對問題求解時,都會提煉出一個區域性最優的方案,但是不一定是整體最優。**而Mysql就是使用這種做優化處理。
還有一種從生物學的名稱得來的演算法,遺傳演算法,可以簡單的理解為動態規劃的變種,通過優勝劣汰的方式獲取到最優的解,作者是花了大篇幅的生物學的名詞來介紹這種演算法,有興趣讀者可以去了解一下。
最後要表達的是 索引的合理使用真的是寫好一個sql指令碼的基礎。