如何在資料庫中使用索引
一、給資訊表建立索引
資訊表為:
建立索引:create index +索引名 on 表名(列名...);
mysql> create index idx_lname_pinyin on employee(lname_pinyin);
顯示索引資訊:show index from +表名;
mysql> show index from employee\G
show index 命令下的專案列表
專案名稱 |
說明 |
Table |
物件表名 |
Non_unique |
是否允許重複(1:允許; 0:禁止) |
Key_name |
索引名 |
Seq_in_index |
內的域序號( 從1開始) |
Column_name |
域名 |
Collation |
排序(A:升序,null:不排序) |
Cardinality |
索引內的非重複值的數目 |
Sub_part |
作為索引部分的域內的字元數目 |
Packed |
關鍵字壓縮方式 |
Null |
是否允許null |
Comment |
索引的型別 |
Index_comment |
備註 |
刪除索引:
drop index 索引名 on 表名
叢生索引:通常的索引在子葉節點中儲存指向實際表的指標,叢生索引儲存的子葉節點儲存的是實際資料
叢生索引的優點:
1、不需要為儲存索引而使用專門的硬碟空間,節約了資源
2、不需要檢索索引後再訪問實際的表,提高了索引效率
但是建立叢生索引時需要對錶中的資料進行排序,在進行資料插入、更新、刪除時比一般的索引需要耗費更多的時間
二、建立多列構成的複合索引及唯一性索引
mysql> create index idx_pinyin on employee(lname_pinyin,fname_pinyin);
三、確認資訊表索引的使用狀態,分析索引優劣
mysql> explain select *from employee where lname_pinyin='wang'\G
專案 |
說明 |
說明 |
ID |
SELECT命令的序號(通常為1,子查詢的話往往從序號2開始) |
|
select_type |
select的命令種類 |
|
SIMPLE |
單純的SELECT命令 |
|
PRIMARY |
最外層的SELECT命令 |
|
UNION |
由UNION語句連線的SELECT命令 |
|
DEPENDENT UNION |
由UNION語句連線的SELECT命令(依賴外部查詢) |
|
SUBQUERY |
子查詢中的SELECT命令 |
|
DEPENDENT SUBQUERY |
子查詢中的SELECT命令(依賴外部查詢) |
|
DERIVED |
派生表(FROM語句的子查詢) |
|
Table |
表名 |
|
type |
表的連線型別 |
(按效率的高低排序) |
system |
只存在一條記錄的表(=系統表) |
|
const |
常量,擁有PRIMARY KEY/UNIQUE制約的索引(結果總為1行) |
|
eq_ref |
連線時由PRIMARY KEY/UNIQUE列進行的等值查詢 |
|
ref |
非UNIQUE列進行的等值查詢 |
|
ref_or_null |
ref中加入了[~OR列名IS NULL]的檢索 |
|
range |
使用索引檢查一定範圍的記錄(=,<>,>,>=,<,<=,IS NULL,<>,BETWEEN,IN等運算子) |
|
index |
全索引掃描 |
|
ALL |
全表掃描 |
|
possible keys |
檢索時可能使用到的索引(不存在索引時為NULL) |
|
key |
檢索時真實使用到的索引(未使用索引時為NULL) |
|
key_len |
使用的索引的關鍵字長度(單位為bytes) |
|
Ref |
需要時與比較的列,或者定製(const) |
|
rows |
需要遍歷的記錄數量 |
|
Extra |
查詢時的追加資訊 (值為index時,使用了覆蓋索引,效能最好) |
四、索引時效的場合總結
1、進行後方一致/部分一致檢索的場合,模糊檢索是不能用索引的;
應儘量使用前方一致或者完全一致的形式進行檢索
如:select *from employee where lname_pinyin like '%w'; --是錯誤的
2、使用了is not null、[<>]比較運算子的場合,也不能使用索引
如:select *from employee where lname_pinyin is not null;--是錯的
3、對列使用了運算、函式的場合,也不能使用索引
如:select *from employee where year(birth)='1988';--這裡對birth這列使用了year函式
4、複合索引的第一列沒有包含在where條件語句中的場合
如建立了複合索引
create index idx_pinyin on employee(lname_pinyin,fname_pinyin);
但是索引時第一列lname沒有包含在where條件裡
如:select *from employee where fname_pinyin='xiao' --沒有包含第一列lname_pinyin