資料庫的索引

2021-08-18 13:56:50 字數 2881 閱讀 2744

索引對於資料庫的高效執行是至關重要的,在我們談到優化查詢效能的時候一般都是指新增索引。

索引分單列索引和組合索引:

索引也分聚集索引和非聚集索引:

對物理儲存順序的理解可以模擬字典中按照拼音查詢和按照部首查詢。按拼音查詢,索引的順序與實際資料儲存的順序是相同的,即同一拼音的字總是在同一塊區域,且b開頭的字的頁碼一定在a開頭的字的頁碼的後面;按部首查詢,同一部首的字會散落在不同的頁碼,沒有順序關係。

聚集索引與非聚集索引聚集(clustered)索引,也叫聚簇索引。採用的都是btree結構,在聚集索引中,樹的葉子節點實際儲存了資料,即葉子節點是資料節點;而在非聚集索引中,葉子節點中儲存的是指向資料儲存位址的指標,即葉子節點仍然是索引節點。

聚集索引對於那些經常要搜尋範圍值的列特別有效。使用聚集索引找到包含第乙個值的行後,便可以確保包含後續索引值的行在物理相鄰。例如,如果應用程式執行 的乙個查詢經常檢索某一日期範圍內的記錄,則使用聚集索引可以迅速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。這樣有助於提高此類查詢的效能。同樣,如果對從表中檢索的資料進行排序時經常要用到某一列,則可以將該錶在該列上設定聚集索引(物理排序),避免每次查詢該列時都進行排序,從而節省成本。

當然,索引不是全是好處沒有壞處的。索引大大提公升了查詢速度,但會降低更新表的速度,在對錶進行insert、update和delete操作時,資料庫不單要修改資料,還要修改儲存索引檔案。索引本身是占用磁碟空間的。

最基本的索引,以下全以mysql為例,建立語句為:

create index indexname on tablename(columnname(length));
或者修改表:

alter

table tablename add index indexname(columnname)

索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

在普通索引的基礎上加乙個unique即可:

create

unique index indexname on tablename(columnname(length))

同樣,也可以用修改表的語句:

alter

table tablename add

unique indexname (columnname(length))

drop index indexname on tablename;

alter

table tablename drop index indexname;

show index from tablename;
常見的有兩種,hash索引和btree索引。

hash索引只能用於對等比較,例如=、<>、<=>(等價)操作符。由於是一次定位資料,不像樹結構的索引需要從根節點到枝節點,最後才能訪問到葉節點這樣多次io訪問,所以檢索效率遠高於btree索引。

但hash索引的劣勢也很明顯,

1. 僅僅能滿足=in<=>(等價於,比如3.0<=>3)查詢,不能使用範圍查詢;

2. 無法避免排序操作。hash索引中存放的是經過hash計算後的雜湊值,其大小關係與運算前的值並無關係,原值有順序關係hash運算後會丟失這種關係;

3. 無法避免全表掃瞄。hash索引是將索引鍵通過hash運算之後,將hash運算結果的hash值和所對應的行指標資訊存放於乙個hash表中,由於不同索引鍵存在相同hash值,所以無法從hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行比較,並得到相應的結果。

4. 遇到大量hash值相等的情況後效能並不一定會比btree高。對於選擇性比較低的索引鍵(即值的可能性很少,比如性別字段),如果建立hash索引,那麼將會存在大量記錄指標資訊存於同乙個hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料訪問,而造成整體效能底下。

這是最常見的索引演算法,它不單能用在比較符上,甚至能用於like操作,使用前提是查詢條件不以乙個萬用字元(%)開頭的常量。

實際上mysql的btree索引是b+tree的資料結構,它是乙個平衡多叉樹。每個葉子節點的高度差不超過1,且同層級之間的節點有指標相互連線。

關於完整的btree結構,一時半會講不清楚,現在掌握地也不好,希望之後能另起乙個專題專門講講資料結構。

我們在設計資料庫表時,一般都會有主鍵,而在建立主鍵的時候那個主鍵就自動擁有了索引,還是唯一索引。

mysql都是在自增id上建立主鍵,另外除了在where條件中會用到索引,在count時也會用到索引,見圖:

用explain來檢視sql的執行計畫,可以看到在count時也能利用到索引。

mysql還有一種特殊的索引叫做全文索引(fulltext index),它只能用在char、varchar和text的字段上。 舊版本的mysql只支援myisam引擎,當然現在也支援innodb了(5.6版本新增特性)。建立和刪除全文索引的方式與其他索引並無不同,但使用方式比較奇特。

select * from

`student`

where

match(`address`) against('guangdong')

當然全文索引是不支援中文的,在5.7版本中有全新的文字外掛程式來處理中文檢索n-gram parser或者經典的sphinx檢索引擎。

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫的索引

索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資訊。索引提供指向儲存在表的指定列中的資料值的指標,然後根據您指定的排序順序對...