天天看點

【資料庫優化專題】MySQL視圖優化(一)

本期資料庫優化專題分享,為大家帶來的是dba+社群mysql領域原創專家——李海翔所著的mysql視圖優化系列文章。以下是第一部分的内容,未完部分敬請關注後續更新。

專家簡介

【資料庫優化專題】MySQL視圖優化(一)

李海翔

網名:那海藍藍

dba+社群mysql領域原創專家

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

一、什麼是視圖

這個标題似乎有點簡單了,一些人會想:作為一名資料庫從業者,作為一名經驗豐富的dba,天天與視圖打交道, 怎麼能不知道什麼是視圖呢?

請在繼續閱讀之前,微閉雙目,休息之餘想一想, 什麼是視圖?思索之後,且與如下标準定義做個比較。

sql标準定義是如下定義視圖的:

【資料庫優化專題】MySQL視圖優化(一)

1、首先,視圖本質上,就是一個“查詢”,而且是一個“有名字的查詢”,名字是誰?——視圖的名稱。這就引申出另外一些概念,什麼是查詢?sql标準做出如下定義:

1.1、base table:基表

sql-data consists entirely of table variables,called base tables.

sql-data構成的完整的表變量的組合,稱為基表。即sql-data的集合。

思考一個問題,create table+insert語句建表并插入一些資料後,其生成物,是否可以稱為“base table”?

1.2、query,查詢

an operation that references zero or more base tables and returns a table is called a query.

引用零個基表(如select 1;則是引用零個基表)或多個基表(多表連接配接操作)的操作(查詢操作)并且傳回一個“table”,這樣的操作稱為“query”(查詢)。可見query是一個“過程”且有結果,而非一個“查詢語句”(select statement)。

1.3、視圖的值,是此有名字的查詢操作的執行結果。

2、table,表。回答1.1中的問題,base table 和table是有差別的。

a table has an ordered collection of one or more columns and an unordered collection of zero or more rows.

從上面的定義可以看出,table除了sql-data外,還有“zero or more rows”,即資料。

3、那麼,什麼是sql-data?

sql-data is data described by sql-schemas — data that is under the control of an sql-implementation in an sql-environment.

sql-schemas和sql-implementation以及sql-environment的定義參見sql标準(如果展開,越展越多)。我們可以簡單認為sql-data就是描述“字段”的資料。是以sql-data可以用以表述表的定義,即base table。

4、與view相似的一個概念,稱為“派生表”,其sql标準的定義如下:

the result of a query is called a derived table.

一個查詢的結果被稱為派生表。即派生表也是一個有結果的查詢。而視圖是查詢的一種,視圖的值是查詢的結果,那麼派生表和視圖之間有什麼差别呢?從形式上看,二者差别僅在于是否有名字。

一個新的問題随之而來:q1:在mysql中,視圖和派生表有差别嗎?他們的處理方式一樣嗎?

未完待續……敬請持續關注~

<b></b>

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