一、什么是索引?
索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含着對數據表里所有記錄的引用指針。更通俗的說,數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度。
索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照數據存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快
要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
1、普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的數據列創建索引。只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。
1.1 直接創建索引(length表示使用名稱前1ength個字符)
CREATE INDEX index_name ON table_name(column_name(length))
1.2 修改表結構的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column_name)
1.3 創建表的時候同時創建索引
CREATE TABLE table_name (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) NOT NULL ,
PRIMARY KEY (id),
INDEX index_name (title)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
1.4 刪除索引
DROP INDEX index_name ON table_name;
1.5 建立復合索引 。
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
2、唯一索引
與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,創建方法和普通索引類似。
如果能確定某個數據列將只包含彼此各不相同的值,在為這個數據列創建索引的時候就應該用關鍵字UNIQUE把它定義為一個唯一索引。這么做的好處:一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;二是MySQL會在有新記錄插入數據表時,自動檢查新記錄的這個字段的值是否已經在某個記錄的這個字段里出現過了;如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證數據記錄的唯一性。事實上,在許多場合,人們創建唯一索引的目的往往不是為了提高訪問速度,而只是為了避免數據出現重復。
2.1 創建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(column_name)
2.2 修改表結構
ALTER TABLE table_name ADD UNIQUE index_name ON (column_name)
2.3 創建表的時候直接指定
CREATE TABLE table_name (
id int(11) NOT NULL AUTO_INCREMENT ,
title char(255) NOT NULL ,
PRIMARY KEY (id),
UNIQUE index_name (title)
);
3、主索引
必須為主鍵字段創建一個索引,這個索引就是所謂的”主索引”。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE。
二、什么視圖?
視圖是一種虛擬的表,是從數據庫中一個或者多個表中導出來的表。數據庫中只存放了視圖的定義,而並沒有存放視圖中的數據,這些數據存放在原來的表中。使用視圖查詢數據時,數據庫系統會從原來的表中取出對應的數據。
1、視圖的作用:
(1)使操作簡便化;
(2)增加數據的安全性;
(3)提高表的邏輯獨立性;
2、創建視圖
CREATE [ ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 視圖名[ ( 屬性清單) ]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
2.1 在單表上創建視圖
CREATE VIEW v1 AS SELECT * FROM t_book;
CREATE VIEW v2 AS SELECT bookName,price FROM t_book;
CREATE VIEW v3(b,p) AS SELECT bookName,price FROM t_book;
2.2 在多表上創建視圖
CREATE VIEW v4 AS SELECT bookName,bookTypeName FROM t_book,t_booktype
WHERE t_book.bookTypeId=t_booktype.id;
CREATE VIEW v5 AS SELECT tb.bookName,tby.bookTypeName FROM t_book
tb,t_booktype tby WHERE tb.bookTypeId=tby.id;
3、查看視圖
3.1 DESCRIBE 語句查看視圖基本信息
DESC v5;
3.2 SHOW TABLE STATUS 語句查看視圖基本信息
SHOW TABLE STATUS LIKE 'v5';
3.3 SHOW CREATE VIEW 語句查看視圖詳細信息
SHOW TABLE STATUS LIKE 't_book';
3.4 在views 表中查看視圖詳細信息
SHOW CREATE VIEW v5;
4、修改視圖
4.1 CREATE OR REPLACE VIEW 語句修改視圖
CREATE OR REPLACE [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 視圖名[( 屬性清單)]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
例如:
CREATE OR REPLACE VIEW v1(bookName,price)
AS SELECT bookName,price
FROM t_book;
4.2 ALTER 語句修改視圖
ALTER [ ALGORITHM ={ UNDEFINED | MERGE | TEMPTABLE }]
VIEW 視圖名[( 屬性清單)]
AS SELECT 語句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
例如:
ALTER VIEW v1 AS SELECT * FROM t_book;
5、更新視圖
更新視圖是指通過視圖來插入(INSERT)、更新(UPDATE)和刪除(DELETE)表中的數據。因為視圖是一個虛擬的表,其中沒有數據。通過視圖更新時,都是轉換基本表來更新。更新視圖時,只能更新權限范圍內的數據。超出了范圍,就不能更新。
5.1 插入(INSERT)
INSERT INTO v1 VALUES(NULL,'java good',120,'feng',1);
5.2 更新(UPDATE)
UPDATE v1 SET bookName='java very good',price=200 WHERE id=5;
5.3 刪除(DELETE)
DELETE FROM v1 WHERE id=5;
6、刪除視圖
刪除視圖是指刪除數據庫中已存在的視圖。刪除視圖時,只能刪除視圖的定義,不會刪除數據;
DROP VIEW [ IF EXISTS ] 視圖名列表[ RESTRICT | CASCADE ]
DROP VIEW IF EXISTS v4;