mysql中的視圖和索引

原文鏈接:https://blog.csdn.net/basycia/article/details/52053255

轉載

1.視圖

    視圖又叫虛表。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。

視圖主要有以下作用
1、安全,權限控制。一些數據表有着重要的信息。有些字段是保密的,不能讓用戶直接看到。這時就可以創建一個視圖,在這張視圖中只保留一部分字段。這樣,用戶就可以查詢自己需要的字段,不能查看保密的字段。

2、性能,快。
關係數據庫的數據常常會分表存儲,使用外鍵建立這些表的之間關係。這時,數據庫查詢通常會用到連接(JOIN)。這樣做不但麻煩,效率相對也比較低。如果建立一個視圖,將相關的表和字段組合在一起,就可以避免使用JOIN查詢數據。

3、靈活,抽取即將廢棄表,產生有用價值。如果系統中有一張舊的表,這張表由於設計的問題,即將被廢棄。然而,很多應用都是基於這張表,不易修改。這時就可以建立一張視圖,視圖中的數據直接映射到新建的表。這樣,就可以少做很多改動,也達到了升級數據表的目的。

關於視圖的學習,我建議你參考mysql手冊。在網上找一些示例,很快就入門了。
2.分類

      視圖在SQL中可以分爲三類

      1 普通視圖(Regular View)

sql模板

  1. CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]
  2. [ WITH <view_attribute> [ ,...n ] ]
  3. AS select_statement
  4. [ WITH CHECK OPTION ] [ ; ]
  5. <view_attribute> ::=
  6. {
  7. [ ENCRYPTION ]
  8. [ SCHEMABINDING ]
  9. [ VIEW_METADATA ] }
解釋:

  參數還是比較少的,現在解釋一下上面的參數:

   ENCRYPTION:視圖是加密的,如果選上這個選項,則無法修改.創建視圖的時候需要將腳本保存,否則再也不能修改了

   SCHEMABINDING:和底層引用到的表進行定義綁定。這個選項選上的話,則視圖所引用到的表不能隨便更改構架(比如列的數據類型),如果需要更改底層表構架,則先drop或者alter在底層表之上綁定的視圖.

   VIEW_METADATA:這個是個很有意思的選項.正如這個選項的名稱所指示,如果不選擇,返回給客戶端的metadata是View所引用表的metadata,如果選擇了這個選項,則返回View的metadata.再通俗點解釋,VIEW_METADATA可以讓視圖看起來貌似表一樣。View的每一個列的定義等直接告訴客戶端,而不是所引用底層表列的定義。

   WITH Check Option:這個選項用於更新數據做限制

限制條件

  •   在View中,除非有TOP關鍵字,否則不能用Order By子句
  •    View在每個Schema中命名必須獨一無二
  •    View不要嵌套儘量
  •    Compute,compute by,INTO關鍵字不允許出現在View中
  •    View不能建立在臨時表
  •    View不能對全文索引進行查詢
實例

建立視圖

  1. CREATE VIEW v_Test
  2. AS
  3. SELECT TOP 10 * FROM table1
查詢視圖

SELECT * FROM v_Test

      2索引視圖(Indexed View)----會自動同步(好也壞)

       索引視圖可以看作是一個和表(Table)等效的對象!,是真實存在於物理數據中。

 要求嚴格:(部分)

  • 索引視圖涉及的基本表必須ANSI_NULLS設置爲ON
  • 索引視圖只能引用基本表

  1. CREATE VIEW v_Test_Index
  2. WITH SCHEMABINDING
  3. AS
  4. SELECT Name,ID
  5. FROM CUSTOMER join NAME="PAUL"
  6. ADN ID>5
  7. GO
  8. --在視圖上建立索引
  9. CREATE UNIQUE CLUSTERED INDEX index
  10. ON v_Test_Index
底層直接聚集索引掃描----通過hash匹配,索引掃描,性能好

但是mysql沒有

注:對索引的操作類似於CML可以使用ALTER,UPDATE,DELETE


附錄:

mysql索引


1、什麼是索引

  索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據庫表裏所有記錄的引用指針

MySQL中索引的存儲類型有兩種:BTREE(樹)和 HASH(哈希),具體和表的存儲引擎有關。MyISAM和InnoDB存儲引擎只支持BTREE索引

2、索引的好處

  適當使用索引能提升數據庫查詢速度!

3、實例:

   在創建表的時候創建索引

    語法:
  1. CREATE TABLE 表名 [ 列名稱 數據類型 ]
  2. [ UNIQUE | FULLTEXT ] [ INDEX | KEY ] [ 索引名稱 ] ( 列名稱 [ length ] ) [ ASC | DESC ]
       說明:  UNIQUE  、 FULLTEXT  爲可選參數,分別表示唯一索引、全文索引;INDEX 與 KEY爲同義詞,兩者的作用相同,用來指定索引;

(1)、普通索引(index): 普通索引是MySQL的基本索引類型,允許在定義索引的列中插入重複值和空值

例:
  1. CREATE TABLE book
  2. (
  3. bookid INT NOT NULL,
  4. bookname VARCHAR(100) NOT NULL,
  5. authors VARCHAR(100) NOT NULL,
  6. info VARCHAR(500) NULL,
  7. year_publication YEAR NOT NULL,
  8. INDEX(year_publication)
  9. );

(2)、唯一索引(unique):唯一索引列的值必須唯一但允許有空值主鍵索引是一種特殊的唯一索引,不允許有空值。

例:

  1. CREATE TABLE book
  2. (
  3. id INT NOT NULL,
  4. name CHAR(50) NOT NULL,
  5. UNIQUE INDEX UniqueIdx(id)
  6. );

(3)、聯合索引:組合索引即是在多個列上創建索引。查詢時,只有在查詢條件中使用了這些字段(創建組合索引的時候指定的哪些列)的最左邊字段時,索引纔會被使用。

  1. CREATE TABLE student
  2. (
  3. id INT NOT NULL,
  4. name CHAR(50) NOT NULL,
  5. age INT NOT NULL,
  6. info VARCHAR(200),
  7. INDEX MultiIdx(id,name,age)
  8. );

(4)、全文索引:MySQL只有MyISAM存儲引擎支持FULLTEXT索引,並且類類型爲CHAR、TEXT、VARCHAR。 並且需要指定表的存儲引擎爲MyISAM。

例:

  1. CREATE TABLE t4
  2. (
  3. id INT NOT NULL,
  4. name CHAR(50) NOT NULL,
  5. age INT NOT NULL,
  6. info VARCHAR(200),
  7. FULLTEXT INDEX FullindexName(info)
  8. ) ENGINE = MyISAM ;

 在已經存在的表上創建索引:

      語法:

  1. ALTER TABLE table_name ADD [ UNIQUE | FULLTEXT ] [ INDEX | KEY ]
  2. [ inex_name ] (col_name [ length ] ,...) [ASC | DESC ]


  1. (1)、普通索引:ALTER TABLE book ADD INDEX indexName( bookname(30) );
  2. (2)、唯一索引:ALTER TABLE book ADD UNIQUE INDEX UniqueIdx( bookid );
  3. (3)、組合索引:ALTER TABLE book ADD INDEX BkAndInfoIdx( authors(20), info(50) );
  4. (4)、全文索引:ALTER TABLE t6 ADD FULLTEXT INDEX infiIdx(info);(前提是這個表的存儲引擎爲 MyISAM)

使用 create  index  創建索引:

  語法:

  1. CREATE [ UNIQUE | FULLTEXT ] [ INDEX | KEY ] INDEX index_name
  2. ON table_name ( col_name[ length ] , ... ) [ASC | DESC ]
  3. 例:在表book的bookname字段上建立名爲BkNameIdx的索引。
  4. CREATE INDEX BkNameIdx ON book (bookname);
  5. 例: 在book表的bookId字段上建立唯一索引。
  6. CREATE UNIQUE INDEX UniqueIdx ON book (bookId);

4、刪除索引:

  1. (1)、ALTER TABLE table_name DROP INDEX index_name;
  2. (2)、DROP INDEX index_name ON table_name ;





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章