「mysql優化專題」視圖應用竟然還可以這麽優化?不得不收藏(8)
一、視圖概述(技術文):
(1)什麽是視圖?
視圖是基於 SQL 語句的結果集的可視化的表。
視圖包含行和列,就像一個真實的表。視圖中的字段就是來自一個或多個數據庫中的真實的表中的字段。視圖並不在數據庫中以存儲的數據值集形式存在,而是存在於實際引用的數據庫表中,視圖的構成可以是單表查詢,多表聯合查詢,分組查詢以及計算(表達式)查詢等。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
(2)視圖的優點:
a、簡化查詢語句(視圖機制使用戶可以將註意力集中在所關心地數據上。如果這些數據不是直接來自基本表,則可以通過定義視圖,使數據庫看起來結構簡單、清晰,並且可以簡化用戶的的數據查詢操作。)
b、可以進行權限控制
把表的權限封閉,但是開放相應的視圖權限,視圖裏只開放部分數據列等。
c、大數據表分表的時候,比如某張表的數據有100萬條,那麽可以將這張表分成四個視圖。
按照對id取余計算
d、用戶能以多種角度看待同一數據:
使不同的用戶以不同的方式看待同一數據,當許多不同種類的用戶共享同一個數據庫時,這種靈活性是非常必要的。
e、對重構數據庫提供了一定程度的邏輯獨立性:
視圖可以使應用程序和數據庫表在一定程度上獨立。
(3)視圖的缺點:
1)性能差:
把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個復雜的多表查詢所定義,那麽,即使是視圖的一個簡單查詢,sql server也要把它變成一個復雜的結合體,需要花費一定的時間。
2)修改限制:
當用戶試圖修改試圖的某些信息時,數據庫必須把它轉化為對基本表的某些信息的修改,對於簡單的試圖來說,這是很方便的,但是,對於比較復雜的試圖,可能是不可修改的。
(4)視圖使用場景(其實就是需要用到視圖上面的幾個優點的時候):
1) 需要權限控制的時候。
2)如果某個查詢結果出現的非常頻繁,就是要經常拿這個查詢結果來做子查詢,使用視圖會更加方便。
3)關鍵信息來源於多個復雜關聯表,可以創建視圖提取我們需要的信息,簡化操作;
(5)視圖的分類:
1)關系視圖:
它屬於數據庫對象的一種,也就是最常見的一種關聯查詢;
2)內嵌視圖:
它不屬於任何用戶,也不是對象,創建方式與普通視圖完全不同,不具有可復用性,不能通過數據字典獲取數據;
3)對象視圖:
它是基於表對象類型的視圖,特性是繼承、封裝等可根據需要構建對象類型封裝復雜查詢(官方:為了迎合對象類型而重建數據表是不實現的);
4)物化視圖:
它主要用於數據庫的容災(備份),實體化的視圖可存儲和查詢,通過DBLink連接在主數據庫物化視圖中復制,當主庫異常備庫接管實現容災;
二、視圖的使用(技術文):
1、創建視圖
-
create or replace view v_test asselect * fromuser;
加上OR REPLACE表示該語句還能替換已有的視圖
2、調取視圖
-
select * from v_test;
3、修改視圖
-
alter view v_test asselect * from user1;
4、刪除視圖
-
drop view if exists v_test;
5、查看視圖
-
show tables;
視圖放在information_schema數據庫下的views表裏
6、查看視圖的定義
show table status from companys like‘v_test‘;
在這之前,我們必須明確!增刪改最終都是修改到基礎表。且視圖中雖然可以更新數據,但是有很多的限制。一般情況下,最好將視圖作為查詢數據的虛擬表,而不要通過視圖更新數據。因為,使用視圖更新數據時,如果沒有全面考慮在視圖中更新數據的限制,就可能會造成數據更新失敗。(技術文)
三、視圖的算法——存在兩種執行的算法
a、Merge:合並的執行方式,每當執行的時候,先將我們的視圖的sql語句與外部查詢視圖的sql語句,混合在一起,最終執行。
b、Temptable:臨時表模式,每當查詢的時候,將視圖所使用的select語句生成一個結果的臨時表,再在當當前臨時表內進行查詢。
四、視圖使用註意點(技術文):
(1)修改操作時要非常非常小心,不然不經意間你已經修改了基本表裏的多條數據;
(2)視圖中的查詢語句性能要調到最優;
(3)雖說上面講到,視圖有些是可以修改的。但是更多的是禁止修改視圖。
對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系或者特殊的沒有約束的一對多字段。還有一些特定的其他結構,這類結構會使得視圖不可更新。
不可更改的情況如下:視圖中含有以下的都不可被修改了。
(一)聚合函數(SUM(), MIN(), MAX(), COUNT()等)。
(二)DISTINCT。如下錯誤。
(三)GROUP BY
(四)HAVING
(五)UNION或UNION ALL
(六)位於選擇列表中的子查詢
(八)FROM子句中的不可更新視圖
(九)WHERE子句中的子查詢,引用FROM子句中的表。
(十)ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成為不可更新的)。
「mysql優化專題」視圖應用竟然還可以這麽優化?不得不收藏(8)