DBLE 是如何實現視圖的?

浩鯨科技 PaaS 組件團隊成員,長期從事分庫分表中間件的相關解決方案工作,熱愛技術,樂於分享。


本文主要講解 DBLE 是如何實現 MySQL 視圖功能的,內容包括 MySQL 視圖相關概念、MySQL 對視圖的實現,以及 DBLE 對視圖的實現。


一、MySQL 視圖概念及 MySQL 中視圖的實現

MySQL 5.0 版本開始引入視圖。視圖本身是一個虛擬表,不存放任何數據。在使用 SQL 語句訪問視圖的時候,它返回的數據是 MySQL 從其他表中生成的。

MySQL 中對於視圖是如何實現的呢?

MySQL 中通過兩種算法來實現視圖功能,分別稱為合併算法(MERGE)臨時表算法(TEMPTABLE)

如下圖所示(圖片出自《高性能 MySQL》):


分佈式 | DBLE 是如何實現視圖的?


合併算法就是將視圖 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 是如何實現視圖的?


總結

本文主要講解了 DBLE 是如何實現 MySQL 視圖的,內容包括 MySQL 視圖相關概念、MySQL 對視圖的實現,以及 DBLE 對視圖的實現,希望對大家理解 DBLE 的視圖實現有所幫助。



分享到:


相關文章: