資料庫 索引

2021-09-25 03:46:54 字數 1687 閱讀 4618

二、索引的分類

索引分為聚集索引和非聚集索引。區別在於聚集索引要求表儲存的資料行的物理順序與索引的列值的邏輯順序相同,非聚集索引則沒有這個要求。正因為這個原因,乙個表只能有乙個聚集索引。

1、聚集索引

聚集索引一般會加在主鍵上,當我們建立表時如果指明了主鍵,則缺省會給該列建立聚集索引,這也是為什麼使用主鍵作為查詢條件效率很高的原因。由於乙個表只能加乙個聚集索引,而聚集索引又是提公升查詢速度最快的索引,因此聚集索引就成了一種相對稀缺的資源。如果我們不經常使用主鍵作為查詢條件,那將其加在主鍵上就是一種浪費,我們也可以手動的將主鍵的聚集索引改為非聚集索引,然後將聚集索引加在其他經常用在查詢條件的列上,比如將聚集索引加在訂單表的訂單編號欄位上。一旦我們給表中的某個欄位加了聚集索引,那麼表中的資料在磁碟上儲存時就由整齊排列的結構轉變成了樹狀結構,也就是上面說的平衡樹結構,換句話說,就是整個表就變成了乙個索引。因此我們最好在建立表時就建立聚集索引,如果在表中已經有了很多資料的時候再建立聚集索引,則建立索引時也同時要改變資料的儲存結構,這可能會很耗時。

2、非聚集索引

由於乙個表只能有乙個聚集索引,而我們在查詢時不一定會用到加了聚集索引的那個字段。比如我們在查詢使用者資訊的時候,很少會使用使用者表的id作為查詢條件,而是使用名字這個字段,這時我們就可以在名字這個欄位上加非聚集索引。非聚集索引同樣需要在增刪改資料的時候進行維護,在使用非聚集索引的時候並不是直接根據非聚集索引找到的資料行,而是非聚集索引會關聯聚集索引,當找到非聚集索引時就同時會找到該索引對應的聚集索引的集合,如果我們要查詢的僅僅是聚集索引列的值則不會再去定位和查詢資料行,而是直接將該索引的值返回,如果我們查詢的字段包含其他列時才會再根據聚集索引定位和查詢相應的資料列。

盜用posttruth的兩張圖:

三、索引的應用

既然索引的目的是加速查詢,那我們就應該在經常作為查詢條件或作為排序的列上加上索引。若作為主鍵但並不常作為查詢條件,則可以將主鍵上的聚集索引換為非聚集索引,而將聚集索引加在最經常作為查詢條件的列或多個列上,方式:

#1、刪除主鍵約束

alter

table person drop

constraint pk__person__117f9d94;

#2、將聚集索引加在其他列上

create

clustered

index test_index on person(

date);

#3、在將主鍵約束加上,此時主鍵上的索引就變為了非聚集索引

alter

table person add

primary

key(id)

;

復合索引可以是聚集索引也可以是非聚集索引,什麼時候應該建立復合索引呢?如上文所說,乙個表中最經常被查詢的字段應該建立乙個復合索引,比如說如果我們經常根據使用者名稱(user_name)查詢使用者的郵箱(email)和**(phone),則應該建立乙個user_name_email_phone的符合索引,最經常作為查詢條件的name最好在索引的第乙個位置,有了這個索引後我們就可以不同過錶而直接通過索引查詢到email和phone欄位的值。

關於索引的建立和刪除等參看:mysql 索引

資料庫 資料庫索引

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

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

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

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...