天天看點

MySQL派生表重構 || MySQL專題3

承接上期,今天繼續為大家帶來mysql視圖優化的原創專家文章分享,來自dba+社群mysql領域原創專家——李海翔。以下是第三部分的内容。

專家簡介

MySQL派生表重構 || MySQL專題3

李海翔

網名:那海藍藍

dba+社群mysql領域原創專家

從事資料庫研發、資料庫測試與技術管理等工作10餘年,對資料庫的核心有深入研究,擅長于postgresql和mysql等開源資料庫的核心與架構。現任職于oracle公司mysql全球開發團隊,從事查詢優化技術的研究和mysql查詢優化器的開發工作。著有《資料庫查詢優化器的藝術》一書。

2 v5.7.5 視圖和from子句中的派生表的重構

2.1.1 v5.7.5 視圖和from子句中的派生表的重構内容

最近幾年,mysql的優化器進步很快,mysql的optimizer團隊對于優化器作了許多的優化工作。

mysql在5.7.5版本中,對于視圖和from子句中的derived table進行了一次重構工作,工作的結果:

1)從概念、編碼實作的角度,統一了二者的處理方式,使得相似的内容處理(視圖和派生表的處理方式)邏輯保持了一緻,同一套代碼清晰便于了解

2)提高了from子句中派生表的處理效率(對于可以merge的視圖和派生表采用merge優化)

3)對于不可merge的視圖和派生表采用“物化”的方式進行優化,達到隻執行一次多次使用的優化目的

例如:

MySQL派生表重構 || MySQL專題3

從這個例子中可以看到,5.7.5版本中對于派生表采用了merge優化,消除了5.5中的子查詢。這樣查詢效率得到較大提高。

從編碼首先看,5.5代碼mysql_make_view()中合并(merge)優化的代碼被取出,這樣就消除了單獨優化視圖的可能。

在sql_resolve.cc檔案中通過調用select_lex::resolve_derived()統一對視圖和派生表進行了如下操作:

MySQL派生表重構 || MySQL專題3

其中,tl可以是視圖或派生表,這樣的對象,要麼被采用“合并”的方式優化,要麼被采用“物化”的方式優化。

如下是一個物化的例子(派生表中多了一個limit子句)。

MySQL派生表重構 || MySQL專題3

其實,mysql優化器的進化一直在進行着,有些進步盡管不如5.7.5對派生表和視圖的優化進步大,但每一個版本,總是在向前邁進。如5.6.3,物化操作隻發生在執行階段,如果是explain獲得執行計劃,則物化操作不發生。

materialization of subqueries in the from clause is postponed until their contents are needed during query execution, which improves performance。

2.1.2 v5.7.5 視圖和from子句中的派生表的重構的限制

不是所有的視圖和派生表都可以被merge,不可merge的情況,類似1.4節,即簡單視圖或派生表,可以被merge,複雜視圖和帶有group/having/distinct/limit/聚集函數等子句的派生表隻能被物化。

<b></b>

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2015-11-17</b>