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 ;