資料庫查詢優化問題筆記

2021-07-14 19:44:02 字數 1624 閱讀 7489

首先,介紹三種聯接方式,合併聯接(merge join),雜湊聯接(hash join)和巢狀迴圈聯接(nested loop join)。

合併聯接:把問題拆分為小問題,通過解決小問題來解決最初的問題,分為兩步:

拆分階段,將序列分為更小的序列

排序階段,把小的序列合在一起(使用合併演算法)來構成更大的序列

巢狀迴圈聯接(迭代,複雜度高)

針對外關係的每一行

檢視內關係裡的所有行來尋找匹配的行

雜湊聯接:

1) 讀取內關係的所有元素

2) 在記憶體裡建乙個雜湊表

3) 逐條讀取外關係的所有元素

4) (用雜湊表的雜湊函式)計算每個元素的雜湊值,來查詢內關係裡相關的雜湊桶內

5) 是否與外關係的元素匹配。

然而,解決實際問題的過程中,會需要對查詢不斷的優化。

動態程式設計:將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。(大量資料查詢時,需要附加額外的規則(或者稱為啟發式演算法)來減少可能性)

貪婪演算法:按照乙個規則(或啟發)以漸進的方式制定查詢計畫。在這個規則下,貪婪演算法逐步尋找最佳演算法,先處理一條join,接著每一步按照同樣規則加一條新的join。(不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。)

例如:比如乙個針對5張表(a,b,c,d,e)4次join 的查詢,為了簡化我們把巢狀join作為可能的聯接方式,按照『使用最低成本的聯接』規則。

直接從 5 個表裡選乙個開始(比如 a)

計算每乙個與 a 的聯接(a 作為內關係或外關係)

發現 「a join b」 成本最低

計算每乙個與 「a joinb」 的結果聯接的成本(「a join b」 作為內關係或外關係)

發現 「(a join b)join c」 成本最低

計算每乙個與 「(ajoin b) join c」 的結果聯接的成本 ……

最後確定執行計畫 「( ((a join b) join c) join d ) join e )」

因為我們是武斷地從表 a 開始,我們可以把同樣的演算法用在 b,然後 c,然後 d, 然後 e。最後保留成本最低的執行計畫。

也可以叫【最近鄰居演算法】,屬於啟發式演算法中一員。

例如postgresql中用的基因演算法:

乙個方法代表一種可能的完整查詢計畫

每一步保留了 p 個方法(即計畫),而不是乙個。

0) p 個計畫隨機建立

1) 成本最低的計畫才會保留

2) 這些最佳計畫混合在一起產生 p 個新的計畫

3) 一些新的計畫被隨機改寫

4) 1,2,3步重複 t 次

5) 然後在最後一次迴圈,從 p 個計畫裡得到最佳計畫。

例如sqlite中用的最近鄰居演算法

以上是我在看資料庫原理(做的關於資料庫查詢優化方面的簡單筆記,如果有興趣研究資料庫原理的,可以看下這篇文章,文章很長,但很有料。

資料庫優化 問題查詢定位

在正常的企業應用中,乙個好的資料庫架構需要多方面的把握和優化 可以從選擇硬體方面提公升磁碟i o 可以通過主從複製或負載均衡等策略對資料庫訪問進行分流 可以通過優化資料庫物件 欄位的選擇以及字段長度的設定優化資料庫空間 可以通過應用優化減少與資料庫的互動 一次查詢出所需的字段資訊 建立連線池等 然而...

資料庫查詢優化

方法 1 1.對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。步驟閱讀 22.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 select id from t where num is...

資料庫查詢優化

本記載,用於保留面對大資料量時,查詢速率待優化,只記錄要點,具體如何操作,還需查詢 1 索引優化 通過建立合理高效的索引,提高查詢的速度.2 sql優化 根據需求,組織優化sql語句,使查詢效率達到最優,在很多情況下要考慮索引的作用 3 水平拆分 如果表的資料量增長特變塊,索引帶來的效能優化可能達到...