SQL 索引
1. 定義
慕課解釋:
索引
(index)是一個單獨的數據庫物理結構,是包含數據表字段的列表,列表中注明字段每個值所在的存儲位置。通俗來說,索引類似于書的目錄,你可以通過目錄迅速查詢書的內容,通過索引迅速查詢數據表的數據。
2. 前言
本小節,我們將一起學習 SQL 中的索引
。
數據庫在進行查詢的時候,需要對整張表進行掃描,當數據表的數據量大的時候,這樣掃描的效率是很低下的。為了提高數據檢索能力,增強數據庫查詢性能,數據庫引入了索引機制,且 SQL 標準中也加入了索引相關操作。
本小節測試數據如下,請先在數據庫中執行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int
);
INSERT INTO imooc_user(id,username,age)
VALUES (1,'peter',18),(2,'pedro',24),(3,'jerry',22),(4,'mike',18),(5,'tom',20);
3. 索引的創建與刪除
索引是一個單獨的數據庫物理結構,因此它也可以通過 Create 和 Drop 指令來創建和刪除。
語法如下:
CREATE INDEX [index_name] ON [table_name]([col]);
DROP INDEX [index_name] ON [table_name];
其中index_name
表示索引名稱,table_name
表示數據表名稱,col
表示字段名稱。
3.1 例1 單字段普通索引
請書寫 SQL 語句,為 imooc_user 的age
字段新建一個普通索引。
分析:
按照語法,使用 Create 新建索引,并指定索引名稱即可。
語句:
CREATE INDEX age_index ON imooc_user(age);
3.2 例2 單字段唯一索引
索引可以分為普通索引
和唯一索引
,唯一索引要求字段必須唯一、不可重復。
請書寫 SQL 語句,為 imooc_user 的username
字段新建一個唯一索引。
分析:
同例1,但需要給索引添加唯一約束,即 Unique。
語句:
CREATE UNIQUE INDEX username_index ON imooc_user(username);
3.3 例3 多字段索引
SQL 也支持我們為多個字段建立索引。
請書寫 SQL 語句,為 imooc_user 的username
和age
字段新建一個普通索引。
分析:
同例1。
語句:
CREATE INDEX username_age_index ON imooc_user(username,age);
3.4 例4 刪除索引
請書寫 SQL 語句,刪除掉 imooc_user 上的age_index
索引。
分析:
按照刪除索引語法寫出語句即可。
語句:
DROP INDEX age_index;
在 MySQL 中,你還需要告訴數據庫索引所在的數據表,如下:
DROP INDEX age_index ON imooc_user;
4. 使用索引
索引的使用是智能
的,數據庫會自動找到對應的索引來加速你的查詢。
如,你已經新建了 username_index 索引,當你以 username 作為條件查找時,會自動使用到 username_index 索引。
如下:
SELECT * FROM imooc_user WHERE username = 'pedro';
4.1 例5 顯示使用索引
索引選擇雖然是智能的,但它有時也會犯錯,所以你可以顯示的指定使用某個索引。
請書寫 SQL 語句,顯示的使用索引去搜索 imooc_user 表中的用戶pedro
。
分析:
通過 Force Index 語法顯示使用索引即可。
語句:
SELECT * FROM imooc_user FORCE INDEX(username_index) WHERE username = 'pedro';
注意: MySQL 支持 Force Index,其它數據庫不支持,且強制式使用某個索引的方式并不好,而選錯索引的概率很低。如果出現了索引選錯的情況,請優先檢查 SQL 語句,嘗試優化一下可讀性。
5. 小結
- 索引是大數據查詢的
利器
,能顯著提升搜索的效率,是一種典型的空間換時間思想運用。 - 不要吝嗇你的磁盤容量,如果某個查詢相應時間很慢,請馬上思考一下,能否使用索引解決。
- 索引遵循
最左
原則,即優先匹配左邊的元素,聯合索引也不例外。