mysql 深入視圖和索引


 

目錄(?)[+]

 

注:求職季,鞏固下MySQL知識!

1.視圖

 

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

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

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

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

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

 

 

      視圖在SQL中可以分為三類

      1 普通視圖(Regular View)

sql模板

 

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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不能對全文索引進行查詢
實例

 

建立視圖

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE VIEW v_Test  
  2. AS  
  3. SELECT TOP 10 * FROM table1  
查詢視圖

 

 

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. SELECT * FROM v_Test  

 

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

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

 要求嚴格:(部分)

 

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

 

 

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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、實例:

   在創建表的時候創建索引

    語法:
[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE   TABLE  表名  [  列名稱  數據類型 ]    
  2.         [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]    [  索引名稱  ]   ( 列名稱  [  length  ]  )  [  ASC | DESC ]  
       說明:  UNIQUE  、 FULLTEXT  為可選參數,分別表示 唯一索引、全文索引;INDEX 與 KEY為同義詞,兩者的作用相同,用來指定索引;

 

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

 

例:
[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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):唯一索引列的值必須唯一但允許有空值主鍵索引是一種特殊的唯一索引,不允許有空值。

例:

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE TABLE  book  
  2. (  
  3.   id  INT  NOT  NULL,  
  4.   name  CHAR(50)  NOT  NULL,  
  5.   UNIQUE  INDEX   UniqueIdx(id)  
  6. );  

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

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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.   
  8.   INDEX   MultiIdx(id,name,age)  
  9. );  

 

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

例:

 

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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 ;  

 

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

      語法:

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ALTER  TABLE  table_name  ADD   [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]   
  2. [  inex_name  ]  (col_name [ length ] ,...)  [ASC | DESC ]  


[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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  創建索引:

  語法:

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  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、刪除索引:

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. 1)、ALTER   TABLE  table_name   DROP   INDEX  index_name;  
  2. 2)、DROP    INDEX     index_name   ON  table_name ;  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM