1. 程式人生 > >如何在資料庫中使用索引

如何在資料庫中使用索引

一、給資訊表建立索引

資訊表為:

建立索引: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