浩鯨科技 PaaS 組件團隊成員,長期從事分庫分表中間件的相關解決方案工作,熱愛技術,樂於分享。
本文主要講解 DBLE 是如何實現 MySQL 視圖功能的,內容包括 MySQL 視圖相關概念、MySQL 對視圖的實現,以及 DBLE 對視圖的實現。
一、MySQL 視圖概念及 MySQL 中視圖的實現
MySQL 5.0 版本開始引入視圖。視圖本身是一個虛擬表,不存放任何數據。在使用 SQL 語句訪問視圖的時候,它返回的數據是 MySQL 從其他表中生成的。
MySQL 中對於視圖是如何實現的呢?
MySQL 中通過兩種算法來實現視圖功能,分別稱為合併算法(MERGE)和臨時表算法(TEMPTABLE)。
如下圖所示(圖片出自《高性能 MySQL》):
![分佈式 | DBLE 是如何實現視圖的?](http://p2.ttnews.xyz/loading.gif)
合併算法就是將視圖 SQL 和查詢 SQL 合併,然後執行查詢,可以看到如果我們通過視圖來簡化 SQL,其實在 MySQL 底層又給我們轉換了過來。
臨時表算法就是在執行查詢的時候,定義的視圖會先生成對應的臨時表,然後服務器基於該臨時表執行相應的查詢。
那麼 MySQL 究竟會使用哪種算法呢?
如果在創建視圖的時沒有顯示指定算法,MySQL 會盡可能的使用合併算法。如果視圖中包含 GROUP BY、DISTINCT、任何聚合函數、UNION、子查詢等,只要無法在原表記錄和視圖記錄中建立一一映射的場景中,MySQL 都會使用臨時表算法來實現視圖(當然這些規則可能隨著 MySQL 的版本更新發生變化)。想要確定 MySQL 究竟使用何種算法,可以 EXPLAIN 一條針對視圖的簡單查詢,如果 select_type為"DERIVED",則為臨時表算法。
二、DBEL 對視圖的實現
DBLE 對視圖的實現主要分為兩種情況,
一種是可下推,另一種為不可下推。- 可下推:DBLE 直接將視圖相關 SQL 下推到後端 MySQL 執行,DBLE 端只保存視圖相應元數據信息。
- 不可下推:DBLE 會在邏輯層面實現視圖,然後當執行視圖相應查詢 SQL 的時候,在將相應查詢 SQL 與視圖 SQL 合併後執行,這裡就相當於 MySQL 中的合併算法了。
那麼可下推或不可下推的情況是如何判斷的呢?
通過判斷相應的邏輯 schema 是不是 nosharding(nosharding 表示 schema 中沒有表配置)。如果是 nosharding 則可下推,否則不可下推。其實這裡可以看出來,可下推的情況可能比較少出現。
DBLE 對視圖的實現詳情如下圖所示:
![分佈式 | DBLE 是如何實現視圖的?](http://p2.ttnews.xyz/loading.gif)
總結
本文主要講解了 DBLE 是如何實現 MySQL 視圖的,內容包括 MySQL 視圖相關概念、MySQL 對視圖的實現,以及 DBLE 對視圖的實現,希望對大家理解 DBLE 的視圖實現有所幫助。
閱讀更多 愛可生 的文章