如何在資料庫中使用索引

2021-08-31 11:42:40 字數 2747 閱讀 3852

一、給資訊表建立索引

資訊表為:

建立索引: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的命令種類

******

單純的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

如何在django中使用mysql資料庫進行操作?

背景介紹 mysql在生產環境中是非常常用的一種關係型資料庫,效能好,開源。而python的django框架在開發環境下自帶了sqlite資料庫,雖然測試很方便,但是在部署時,最好更換成mysql資料庫。在部署django的mysql時,踩了乙個坑,而且解答也不是很完善,所以記錄一下自己的配置過程。...

如何在PHP中使用Oracle資料庫

在php3.0以上版本中,php內建了幾乎目前所有的資料庫處理函式,包括oracle 在本文中我們通過乙個例項來介紹了如何使用這些函式來操作oracle資料庫。php提供了2大類api 應用程式介面 來操作oracle資料庫。乙個是標準的oracle處理函式 ora 另乙個是oracle 8呼叫介面...

如何在資料庫動態建表

動態建表首先需要了解statement類 statement 物件用 connection 的方法createstatement 建立,例如 建立連線物件 connection connection dbutil.getconnection 建立statement物件 statement state...