日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql技术分享-- 视图是什么

發布時間:2023/12/4 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql技术分享-- 视图是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

視圖

  • 最近遇到mysql鎖相關問題,在查閱資料時候,經常能看到在鎖的解釋中總有視圖的概念出現,因此我覺得有必要先去了解一下視圖相關的詳細信息,有助于我對mysql鎖相關的理解。
  • 視圖(View)是一個命名的虛擬表,由一個查詢來定義,可以當成表使用。與持久表(permanent table)不同的是,視圖中的數據沒有物理表現形式(沒有存儲在文件)

視圖的作用

  • 視圖在我們實際應用開發時候接觸的比較少,但是他在數據庫中扮演著重要的角色。視圖的主要用途之一就是被用做一個抽象的裝置,特別是對于某些場景下應用程序,程序不需要關心基礎表(base table)的結構,只需要按照視圖定義來獲取數據,或者更新數據。因此視圖同時在一定程度上起到一個安全層的作用。

  • mySql 的5.0 版本后才支持視圖,預發格式如下:

CREATE VIEW <視圖名> AS <SELECT語句>
  • 視圖名:指定視圖的名稱,名稱在數據庫中必須是唯一的,不能與其他表或者視圖同名

  • select 語句:指定創建視圖的select語句,可以用于查詢多個基礎表的源視圖。

  • 視圖是基于表的一個虛擬表,但是我們可以對某些視圖進行更新操作,其實就是通過視圖定義來更新基本表,這種可以進行更新操作的視圖是可更新視圖(updatable view)。視圖中定義的WITH CHECK OPTION 就是針對可更新視圖做的設置。看如下案例:

create table t(id int);create view v_t as select * from t where id<10;insert into v_t select 20;select * from v_t;insert into v_t VALUES (9);select * from v_tselect * from t
  • 創建一個id< 10的視圖,但是往里插入了id為20的值,插入操作并沒有報錯,但是我們查詢視圖還是沒有能查到的數據。但是我們在t中是可以看到有兩天數據進行了insert, 我們可以修改一下視圖的定義,加上WITH CHECH OPTION:
alter view v_t as select * from t where id < 10 with check option;insert into v_t select 30;
  • 本次mysql數據操作后得到錯誤信息i:
[SQL] insert into v_t select 30[Err] 1369 - CHECK OPTION failed 'test.v_t'
  • 在添加with check option后mySql數據庫會對更新視圖插入的數據進行檢查,對于不滿足視圖定義的條件的數據,拋出異常,不允許更新

  • mySql常用命令show tables, 會展示當前數據庫下的表,視圖是虛表,同樣會被查詢出。

  • mysql中有對應的語法用來查詢基礎表,排除視圖:

select * from information_schema.TABLES where TABLE_TYPE = 'BASE TABLE' and TABLE_SCHEMA = DATABASE();

  • 單獨查詢視圖內容:
select * from information_schema.VIEWS where TABLE_SCHEMA = DATABASE();

物化視圖

  • Oracle數據庫才支持物化視圖----該視圖不是基于基表的虛表,而是根據基表實際存在的實體表。可以用于預先計算并保存表的其他緯度信息,這樣在執行復雜查詢時候,可以避免進行耗時的一些操作,快速得到結果

  • 物化視圖需要解決的一個問題在于當基礎表發送DML操作后,物化視圖必須跟進,刷新模式有兩種:

    • ON DEMAND :物化視圖在用戶使用時候進行刷新
    • ON COMMIT:在對基礎表DML操作提交同時進行刷新
  • 刷新方法有四種:

    • FAST:增量刷新,只刷新上次刷新以后進行的修改
    • COMPLETE:對整個物化視圖進行全量的刷新
    • FORCE:刷新時候回判斷是否可以進行快速刷新,如果可以就采用FAST,否則用COMPLETE
    • NEVER:不進行任何刷新
  • 以上物化視圖都是Oracle數據庫才支持,MySQL數據庫本身并不支持,也就是MySQL中視圖總數虛擬的,當我們可以通過一些機制來實現,例如創建一個ON DEMAND的物化視圖還是比較簡單,可以定時將數據導入另外一張表,例如有如下訂單表:

create table orders( order_id int UNSIGNED not null AUTO_INCREMENT, product_name VARCHAR(30) not null, price DECIMAL(8,2) not null, amount SMALLINT not null, PRIMARY KEY (order_id) )ENGINE=INNODBinsert into orders values (null, 'cpu', 138.2,1), (null, 'memory', 89.2,5), (null, 'cpu', 98.2,6), (null, 'cpu', 333.2,33);select * from orderscreate table orders_mv( product_name varchar(30) not null, price_sum DECIMAL(8,2) not null, amount_sum int not null, price_avg FLOAT not null, orders_cnt int not null, UNIQUE INDEX(product_name) );INSERT into orders_mv select product_name, sum(price), SUM(amount), AVG(price),count(*) from orders GROUP BY product_name;select * from orders_mv
  • orders 數據:

  • orders_mv 數據

  • 如上方式我們吧物化視圖定義為一張表,不過我們以mv結尾,讓DBA很好的理解這張表的作用,這樣就有了一個統計信息,如果是要實現ON DEMAND的物化視圖,只需要吧表清空,重新導入即可。這種方式是Complete刷新方式

  • FAST刷新方式也是可以的,每次刷新紀錄上次order_id的位置,下次更新之后的數據。

  • ON COMMIT方式的話就不容易了,Oracle數據庫中通過物化視圖日志來實現的,mySQL沒有這個功能,mySQL需要實現的話可以通過觸發器實現。(略)

上一篇:數據結構與索引-- mySql索引詭異事件
下一篇:mysql技術分享–表分區實現

總結

以上是生活随笔為你收集整理的mysql技术分享-- 视图是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。