多數資料庫,使用 b 樹(balance tree)的結構來儲存索引。
b 樹,
最上層節點:根節點
最下層節點:葉子節點
兩者之間的節點:中間節點
b 樹,顯著特徵:從根節點,到各個葉子節點的距離都是相等的。如此,檢索任何值時,都經過相同數目的節點。
[sql]view plain
copy
create
index
idx_lname_pinyin
onemployee(lname_pinyin);
show index
from
employee\g
drop
index
idx_lname_pinyin
onemployee;
伴隨主鍵的定義而建立的特別索引,被稱為:叢生索引(
clustered index
)乙個表,只有乙個叢生索引。
普通的索引,在葉子節點中儲存的是指向實際表的指標。
而,叢生索引,在葉子節點中儲存的就是實際資料。
叢生索引,
不需要為儲存索引,而使用專用的硬碟空間,節約資源
不需要檢查索引後,再訪問實際的表,提高了效率
建立叢生索引時,需要對錶中資料進行排序,因此,在執行資料插入、更新、刪除等操作時,比普通索引慢。
復合索引
[sql]view plain
copy
create
index
idx_pinyin
onemployee( lname_pinyin, fname_pinyin);
show index
from
employee\g
唯一性索引
使用unique關鍵字,來建立不可重複的索引,稱為:唯一性索引。
對特定列建立唯一性索引,相當於對該列追加了唯一性制約。
建立唯一性索引的時候,如果物件列中,已經含有重複資料,則:建立失敗,報錯。
建立成功後,如果,插入重複資料,則:插入失敗,報錯。
指定多個列,來建立唯一性索引,只要,這些列的組合資料不重複,就可以建立成功。
[sql]view plain
copy
create
unique
index
idx_fname
onemployee(fname);
create
unique
index
idx_lname
onemployee(lname);
create
unique
index
idx_fullname
onemployee(lname, fname);
[sql]view plain
copy
explain
select
* from
employee
where
lname_pinyin=
'wang'
\g
[sql]view plain
copy
create
index
idx_lname_pinyin
onemployee(lname_pinyin);
explain select
* from
employee
where
lname_pinyin=
'wang'
\g
explain 命令的說明:p100 **
如果,建立索引後,遍歷的次數與建立索引之前,變化不大。
說明,建立索引時,選擇的列名不合理,需要選擇合適的列重建索引。這是分析索引優劣的方法。
追加了索引後,也不能保證在每次檢索時都會使用列索引。
如果, sql 檢索語句編寫不當,就無法使用索引。
1、like 運算子,進行模糊檢索時,只能在前方一致的檢索時,才能使用索引。
以下寫法,索引不會被使用。
[sql]view plain
copy
select
* from
employee
where
lname_pinyin
like
'%w%'
; select
* from
employee
where
lname_pinyin
like
'%w'
;
2、使用 is not null 、 <> 的場合,也不會使用索引。如下:
[sql]view plain
copy
select
* from
employee
where
lname_pinyin
isnot
null
; select
* from
employee
where
lname_pinyin <>
'wang'
;
3、對列使用了運算或者函式的情況下,不會使用索引,如下:
[sql]view plain
copy
select
* from
employee
where
year
(birth) =
'1980'
; -- 不使用索引
select
* from
employee
where
birth >=
'1980-01-01'
andbirth <=
'1980-12-31'
; --使用了索引
4、復合索引的第一列,沒有包含在 where 條件語句中,如下:
[sql]view plain
copy
create
index
idx_pinyin
onemployee(lname_pinyin, fname_pinyin);
select
* from
employee
where
lname_pinyin =
'wang'
andfname_pinyin =
'xiao'
; --用了索引
select
* from
employee
where
lname_pinyin =
'wang'
; --用了索引
select
* from
employee
where
fname_pinyin =
'xiao'
; -- 沒有使用索引
select
* from
employee
where
lname_pinyin =
'wang'
orfname_pinyin =
'xiao'
; -- 沒有使用索引
實際開發過程中,需要積極使用 explain 命令,來確認索引的使用情況,及時作相應修改。
資料庫 資料庫索引
索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...
資料庫mysql索引 資料庫 mysql索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
資料庫索引
索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...