mysql技术分享-- 视图是什么
視圖
- 最近遇到mysql鎖相關問題,在查閱資料時候,經常能看到在鎖的解釋中總有視圖的概念出現,因此我覺得有必要先去了解一下視圖相關的詳細信息,有助于我對mysql鎖相關的理解。
- 視圖(View)是一個命名的虛擬表,由一個查詢來定義,可以當成表使用。與持久表(permanent table)不同的是,視圖中的數據沒有物理表現形式(沒有存儲在文件)
視圖的作用
-
視圖在我們實際應用開發時候接觸的比較少,但是他在數據庫中扮演著重要的角色。視圖的主要用途之一就是被用做一個抽象的裝置,特別是對于某些場景下應用程序,程序不需要關心基礎表(base table)的結構,只需要按照視圖定義來獲取數據,或者更新數據。因此視圖同時在一定程度上起到一個安全層的作用。
-
mySql 的5.0 版本后才支持視圖,預發格式如下:
-
視圖名:指定視圖的名稱,名稱在數據庫中必須是唯一的,不能與其他表或者視圖同名
-
select 語句:指定創建視圖的select語句,可以用于查詢多個基礎表的源視圖。
-
視圖是基于表的一個虛擬表,但是我們可以對某些視圖進行更新操作,其實就是通過視圖定義來更新基本表,這種可以進行更新操作的視圖是可更新視圖(updatable view)。視圖中定義的WITH CHECK OPTION 就是針對可更新視圖做的設置。看如下案例:
- 創建一個id< 10的視圖,但是往里插入了id為20的值,插入操作并沒有報錯,但是我們查詢視圖還是沒有能查到的數據。但是我們在t中是可以看到有兩天數據進行了insert, 我們可以修改一下視圖的定義,加上WITH CHECH OPTION:
- 本次mysql數據操作后得到錯誤信息i:
-
在添加with check option后mySql數據庫會對更新視圖插入的數據進行檢查,對于不滿足視圖定義的條件的數據,拋出異常,不允許更新
-
mySql常用命令show tables, 會展示當前數據庫下的表,視圖是虛表,同樣會被查詢出。
-
mysql中有對應的語法用來查詢基礎表,排除視圖:
- 單獨查詢視圖內容:
物化視圖
-
Oracle數據庫才支持物化視圖----該視圖不是基于基表的虛表,而是根據基表實際存在的實體表。可以用于預先計算并保存表的其他緯度信息,這樣在執行復雜查詢時候,可以避免進行耗時的一些操作,快速得到結果
-
物化視圖需要解決的一個問題在于當基礎表發送DML操作后,物化視圖必須跟進,刷新模式有兩種:
- ON DEMAND :物化視圖在用戶使用時候進行刷新
- ON COMMIT:在對基礎表DML操作提交同時進行刷新
-
刷新方法有四種:
- FAST:增量刷新,只刷新上次刷新以后進行的修改
- COMPLETE:對整個物化視圖進行全量的刷新
- FORCE:刷新時候回判斷是否可以進行快速刷新,如果可以就采用FAST,否則用COMPLETE
- NEVER:不進行任何刷新
-
以上物化視圖都是Oracle數據庫才支持,MySQL數據庫本身并不支持,也就是MySQL中視圖總數虛擬的,當我們可以通過一些機制來實現,例如創建一個ON DEMAND的物化視圖還是比較簡單,可以定時將數據導入另外一張表,例如有如下訂單表:
-
orders 數據:
-
orders_mv 數據
-
如上方式我們吧物化視圖定義為一張表,不過我們以mv結尾,讓DBA很好的理解這張表的作用,這樣就有了一個統計信息,如果是要實現ON DEMAND的物化視圖,只需要吧表清空,重新導入即可。這種方式是Complete刷新方式
-
FAST刷新方式也是可以的,每次刷新紀錄上次order_id的位置,下次更新之后的數據。
-
ON COMMIT方式的話就不容易了,Oracle數據庫中通過物化視圖日志來實現的,mySQL沒有這個功能,mySQL需要實現的話可以通過觸發器實現。(略)
上一篇:數據結構與索引-- mySql索引詭異事件
下一篇:mysql技術分享–表分區實現
總結
以上是生活随笔為你收集整理的mysql技术分享-- 视图是什么的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怀孕妇可以吃阿胶吗
- 下一篇: mysql技术分享--表分区实现