資料庫使用3 索引系列

2021-06-26 07:47:57 字數 2701 閱讀 3445

多數資料庫,使用 b 樹(balance tree)的結構來儲存索引。

www.2cto.com  

b 樹,

最上層節點:根節點

最下層節點:葉子節點

兩者之間的節點:中間節點

b 樹,顯著特徵:從根節點,到各個葉子節點的距離都是相等的。如此,檢索任何值時,都經過相同數目的節點。

[sql] 

create index idx_lname_pinyin on employee(lname_pinyin);  

show index from employee\g  

drop index idx_lname_pinyin on employee;  

伴隨主鍵的定義而建立的特別索引,被稱為:叢生索引(clustered index)

乙個表,只有乙個叢生索引。

普通的索引,在葉子節點中儲存的是指向實際表的指標。

而,叢生索引,在葉子節點中儲存的就是實際資料。

叢生索引,

不需要為儲存索引,而使用專用的硬碟空間,節約資源

不需要檢查索引後,再訪問實際的表,提高了效率

建立叢生索引時,需要對錶中資料進行排序,因此,在執行資料插入、更新、刪除等操作時,比普通索引慢。

復合索引

[sql] 

create index idx_pinyin on employee( lname_pinyin, fname_pinyin);  

show index from employee\g  

唯一性索引

使用 unique 關鍵字,來建立不可重複的索引,稱為:唯一性索引。

對特定列建立唯一性索引,相當於對該列追加了唯一性制約。

建立唯一性索引的時候,如果物件列中,已經含有重複資料,則:建立失敗,報錯。

建立成功後,如果,插入重複資料,則:插入失敗,報錯。

指定多個列,來建立唯一性索引,只要,這些列的組合資料不重複,就可以建立成功。

[sql] 

create unique index idx_fname on employee(fname);  

create unique index idx_lname on employee(lname);  

create unique index idx_fullname on employee(lname, fname);  

[sql] 

explain select * from employee where lname_pinyin='wang'\g  

[sql] 

create index idx_lname_pinyin on employee(lname_pinyin);  

explain select * from employee where lname_pinyin='wang'\g  

explain 命令的說明:p100 **

如果,建立索引後,遍歷的次數與建立索引之前,變化不大。

說明,建立索引時,選擇的列名不合理,需要選擇合適的列重建索引。這是分析索引優劣的方法。

追加了索引後,也不能保證在每次檢索時都會使用列索引。

如果, sql 檢索語句編寫不當,就無法使用索引。

1、like 運算子,進行模糊檢索時,只能在前方一致的檢索時,才能使用索引。

以下寫法,索引不會被使用。

[sql] 

select * from employee where lname_pinyin like '%w%';  

select * from employee where lname_pinyin like '%w';  

2、使用 is not null 、 <> 的場合,也不會使用索引。如下:

[sql] 

select * from employee where lname_pinyin is not null;  

select * from employee where lname_pinyin <> 'wang';  

3、對列使用了運算或者函式的情況下,不會使用索引,如下:

[sql] 

select * from employee where year(birth) = '1980'; -- 不使用索引  

select * from employee where birth >= '1980-01-01' and birth <= '1980-12-31'; --使用了索引  

4、復合索引的第一列,沒有包含在 where 條件語句中,如下:

[sql] 

create index idx_pinyin on employee(lname_pinyin, fname_pinyin);  

select * from employee where lname_pinyin = 'wang' and fname_pinyin = 'xiao'; --用了索引  

select * from employee where lname_pinyin = 'wang'; --用了索引  

select * from employee where fname_pinyin = 'xiao'; -- 沒有使用索引  

select * from employee where lname_pinyin = 'wang' or fname_pinyin = 'xiao'; -- 沒有使用索引  

實際開發過程中,需要積極使用 explain 命令,來確認索引的使用情況,及時作相應修改。

資料庫(3)資料庫索引

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。1.2 從索引的底層資料結構來看 b 樹索引和hash索引 1.2 從索引的建立方式 主鍵索引,唯一索引,普通索引,組合索引和全文索引 二.查詢時會使用索引的情況 三.查詢時不會使用索引的情況 四.推薦建立索引的列 五...

資料庫索引使用

1 不宜建立索引的情形 1 經常插入,修改和刪除的表 2 資料量比較小的表,因為查詢優化器在搜尋索引時所花費的時間可能會大於遍歷全表的資料所需要的時間 2.適合建立索引的情形 1 為where子句中出現的列建立索引 2 建立組合索引 3 為group by子句中出現的列建立索引 3.聚集索引的設計原...

資料庫 索引的使用

1.索引的含義和特點 1 索引是單獨的 儲存在磁碟上的資料結構 他們包含著對資料表裡所有記錄的引用指標。2 通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性。3 可以大大的加快資料的查詢速度 4 加速表與表之間的聯絡 5 減少查詢中分組和排序的時間 6 建立索引的維護索引需要耗費時間 並且隨著...