1. 程式人生 > >mysql深入之檢視和索引

mysql深入之檢視和索引

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

1.檢視

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

檢視主要有以下作用1、安全,許可權控制。一些資料表有著重要的資訊。有些欄位是保密的,不能讓使用者直接看到。這時就可以建立一個檢視,在這張檢視中只保留一部分欄位。這樣,使用者就可以查詢自己需要的欄位,不能檢視保密的欄位。

2、效能,快。關係資料庫的資料常常會分表儲存,使用外來鍵建立這些表的之間關係。這時,資料庫查詢通常會用到連線(JOIN)。這樣做不但麻煩,效率相對也比較低。如果建立一個檢視,將相關的表和欄位組合在一起,就可以避免使用
JOIN
查詢資料。 3、靈活,抽取即將廢棄表,產生有用價值。如果系統中有一張舊的表,這張表由於設計的問題,即將被廢棄。然而,很多應用都是基於這張表,不易修改。這時就可以建立一張檢視,檢視中的資料直接對映到新建的表。這樣,就可以少做很多改動,也達到了升級資料表的目的。 關於檢視的學習,我建議你參考mysql手冊。在網上找一些示例,很快就入門了。
2.分類

      檢視在SQL中可以分為三類

      1 普通檢視(Regular View)

sql模板

CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] 
[ WITH <view_attribute> [ ,...n ] ] 
AS select_statement 
[ WITH CHECK OPTION ] [ ; ]
<view_attribute> ::= 
{
    [ ENCRYPTION ]
    [ SCHEMABINDING ]
    [ 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不能對全文索引進行查詢
例項

建立檢視

CREATE VIEW v_Test
AS
SELECT TOP 10 * FROM table1
查詢檢視
SELECT * FROM v_Test

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

       索引檢視可以看作是一個和表(Table)等效的物件!,是真實存在於物理資料中。

 要求嚴格:(部分)

  • 索引檢視涉及的基本表必須ANSI_NULLS設定為ON
  • 索引檢視只能引用基本表
CREATE VIEW v_Test_Index
WITH SCHEMABINDING
AS
SELECT Name,ID
FROM CUSTOMER join NAME="PAUL"
ADN ID>5
GO
--在檢視上建立索引
CREATE UNIQUE CLUSTERED INDEX index
ON v_Test_Index
底層直接聚集索引掃描----通過hash匹配,索引掃描,效能好

但是mysql沒有

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

附錄:

mysql索引

1、什麼是索引

  索引是一個單獨的、儲存在磁碟上的資料庫結構,它們包含著對資料庫表裡所有記錄的引用指標

MySQL中索引的儲存型別有兩種:BTREE(樹)和 HASH(雜湊),具體和表的儲存引擎有關。MyISAM和InnoDB儲存引擎只支援BTREE索引

2、索引的好處

  適當使用索引能提升資料庫查詢速度!

3、例項:

   在建立表的時候建立索引

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

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

例:
CREATE  TABLE book
(
bookid   INT  NOT  NULL,
bookname VARCHAR(100)  NOT  NULL,
authors  VARCHAR(100)  NOT  NULL,
info  VARCHAR(500) NULL,
year_publication   YEAR  NOT  NULL,
INDEX(year_publication)
);

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

例:

CREATE TABLE  book
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  UNIQUE  INDEX   UniqueIdx(id)
);

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

CREATE TABLE student
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),

  INDEX   MultiIdx(id,name,age)
);

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

例:

CREATE TABLE t4
(
  id  INT  NOT  NULL,
  name  CHAR(50)  NOT  NULL,
  age  INT  NOT  NULL,
  info  VARCHAR(200),
  FULLTEXT INDEX   FullindexName(info)
) ENGINE = MyISAM ;

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

      語法:

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


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

使用 create  index  建立索引:

  語法:

CREATE    [  UNIQUE  |  FULLTEXT  ]   [  INDEX   |   KEY    ]  INDEX  index_name
ON   table_name ( col_name[ length ] , ... )  [ASC | DESC ]
 例:在表book的bookname欄位上建立名為BkNameIdx的索引。
CREATE INDEX  BkNameIdx   ON   book (bookname);
  例: 在book表的bookId欄位上建立唯一索引。
CREATE   UNIQUE    INDEX  UniqueIdx    ON   book (bookId);

4、刪除索引:

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