資料庫學習筆記之索引詳解

2021-10-25 05:27:26 字數 3644 閱讀 3953

索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。

索引的乙個主要目的就是加快檢索表中資料,亦即能協助資訊搜尋者盡快的找到符合限制條件的記錄id的輔助資料結構。

如果說把資料庫看作字典的話,那麼索引可以被看作目錄。

在資料庫表中,對欄位建立索引可以大大提高查詢速度。通過善用這些索引,可以令mysql的查詢和執行更加高效。

索引是對資料庫表中乙個或多個列(例如,employee 表的姓名 (name) 列)的值進行排序的結構。

例如這樣乙個查詢:select * from table1 where id=10000。如果沒有索引,必須遍歷整個表,直到id等於10000的這一行被找到為止;有了索引之後(必須是在id這一列上建立的索引),即可在索引中查詢。由於索引是經過某種演算法優化過的,因而查詢次數要少的多。可見,索引是用來定位的。

從資料搜尋實現的角度來看,索引也是另外一類檔案/記錄,它包含著可以指示出相關資料記錄的各種記錄。其中,每一索引都有乙個相對應的搜尋碼,字元段的任意乙個子集都能夠形成乙個搜尋碼。

這樣,索引就相當於所有資料目錄項的乙個集合,它能為既定的搜尋碼值的所有資料目錄項提供定位所需的各種有效支援 。

資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。索引分為聚簇索引和非聚簇索引兩種,聚簇索引 是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。

根據資料庫的功能,可以在資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引。有關資料庫所支援的索引功能的詳細資訊,請參見資料庫文件。

create index index_name on table_name(col_name)
普通索引是最基本的索引,沒有什麼特別限制,主要是為了增加這個欄位的查詢速度。

create unique index user_id_index on user(id)
唯一索引是強調表中資料記錄的唯一性,允許null值,是不允許其中任何兩行具有相同索引值的索引。

當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。

資料庫還可能防止新增將在表中建立重複鍵值的新資料。

例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。

資料庫表經常有一列或多列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。

不允許null值。

alter table 'table_name' add primary key pk_index('col');
在多個單列索引中,mysql只能用到其中的那個它認為似乎是最有效率的單列索引。

組合索引是多列值組成乙個索引,專門用於組合搜尋,效率大於索引合併。

alter table 'table_name' add index index_name('col1','col2','col3');
遵循「最左字首」原則,把最常用作為檢索或排序的列放在最左,依次遞減,組合索引相當於建立了col1,col1col2,col1col2col3三個索引,而col2或者col3是不能使用索引的。

全文索引技術是搜尋引擎的關鍵技術。

試想在1m大小的檔案中搜尋乙個詞,可能需要幾秒,在100m的檔案中可能需要幾十秒,如果在更大的檔案中搜尋那麼就需要更大的系統開銷,這樣的開銷是不現實的。

所以在這樣的矛盾下出現了全文索引技術,有時候有人叫倒排文件技術。

alter table 'table_name' add fulltext index ft_index('col');
原理:

原理是先定義乙個詞庫,然後在文章中查詢每個詞條(term)出現的頻率和位置,把這樣的頻率和位置資訊按照詞庫的順序歸納,這樣就相當於對檔案建立了乙個以詞庫為目錄的索引,這樣查詢某個詞的時候就能很快的定位到該詞出現的位置。

問題在處理英文文件的時候顯然這樣的方式是非常好的,因為英文自然的被空格分成若干詞,只要我們有足夠大的詞彙庫就能很好的處理。但是亞洲文字因為沒有空格作為斷詞標誌,所以就很難判斷乙個詞,而且人們使用的詞彙在不斷的變化,而維護乙個可擴充套件的詞彙庫的成本是很高的,所以問題出現了。

解決出現這樣的問題使「分詞」成為全文索引的關鍵技術。有兩種基本的方法:

1.二元法 它把所有有可能的每兩兩漢字的組合看為乙個片語,這樣就沒有維護詞庫的開銷。

2.詞庫法 它使使用詞庫中的詞作為切分的標準,這樣也出現了詞庫跟不上詞彙發展的問題,除非你維護詞庫。

實際上現在很多著名的搜尋引擎都使用了多種分詞的辦法,比如「正向最大匹配」+「逆向最大匹配」,基於統計學的新詞識別,自動維護詞庫等技術,但是顯然這樣的技術還沒有做到完美。

聚集索引是指資料庫錶行中資料的物理順序與鍵值的邏輯(索引)順序相同。

乙個表只能有乙個聚集索引,因為乙個表的物理順序只有一種情況,所以,對應的聚集索引只能有乙個。

如果某索引不是聚集索引,則表中的行物理順序與素引順序不匹配。

與非聚集索引相比,聚集索引有著更快的檢索速度。如下圖,葉節點中直接包含了具體資料。

與聚集索引不同,非聚集索引的邏輯順序與磁碟上行的物理儲存順序不同。

磁碟上的資料可以隨意分布,而通過非聚集索引,可以在邏輯上為資料排序。

葉節點沒有包含具體的資料,而是包含了乙個指向具體資料的指標。

一般來說有如下幾種:平衡樹(例如b樹(多路平衡搜尋樹)),b+樹,hashes (雜湊)等

關於b數和b+樹,可以參考這裡。

mysql索引的底層資料結構主要是由b+樹構成索引,參考這裡。

b+tree對比btree的優點:

`1、磁碟讀寫代價更低

一般來說b+tree比btree更適合實現外存的索引結構;

因為儲存引擎的設計專家巧妙的利用了外存(磁碟)的儲存結構,即磁碟的最小儲存單位是扇區(sector),而作業系統的塊(block)通常是整數倍的sector,作業系統以頁(page)為單位管理記憶體,一頁(page)通常預設為4k,資料庫的頁通常設定為作業系統頁的整數倍。

因此索引結構的節點被設計為乙個頁的大小,然後利用外存的「預讀取」原則,每次讀取的時候,把整個節點的資料讀取到記憶體中,然後在記憶體中查詢,已知記憶體的讀取速度是外存讀取i/o速度的幾百倍,那麼提公升查詢速度的關鍵就在於盡可能少的磁碟i/o,那麼可以知道,每個節點中的key個數越多,那麼樹的高度越小,需要i/o的次數越少。

因此一般來說b+tree比btree更快,因為b+tree的非葉節點中不儲存data,就可以儲存更多的key。

2、查詢速度更穩定

由於b+tree非葉子節點不儲存資料(data),因此所有的資料都要查詢至葉子節點,而葉子節點的高度都是相同的,因此所有資料的查詢速度都是一樣的。

1.大大加快資料的檢索速度;

2.建立唯一性索引,保證資料庫表中每一行資料的唯一性;

3.加速表和表之間的連線;

4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。

1.索引需要佔物理空間。

2.當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

可以參考這裡。

資料庫之 索引(學習筆記)

索引是由資料庫表一列或者多列組合而成,其作用是提高對錶中資料的查詢速度,類似圖書的圖書目錄,方便快速定位,尋找指定的內容 優點 提高查詢資料的速度 缺點 建立和維護索引的時間增加了 1.普通索引 這類索引可以建立在任何型別資料庫中 2.唯一性索引 使用unique引數可可以設定,在建立唯一性索引時,...

SQL server 資料庫之「索引」詳解

什麼是索引?資料庫中的索引與書籍中的目錄類似,索引使sql server編排資料的內部方法,它為sql server提供一種方法來編排查詢資料的路由。索引頁是資料中儲存索引的資料頁。索引頁存放檢索資料行的關鍵字頁及該資料行的位址指標。通過使用索引,可以大大提高資料庫的檢索速度 改善資料庫效能。索引的...

資料庫學習筆記 索引

二 待補充 在資料庫表中,對欄位建立索引可以大大提高查詢速度。通過善用這些索引,可以令mysql的查詢和 執行更加高效。修改表結構 新增主鍵索引 alter table 表名 add primary key 列名 alter table 表名 add unique 列名 alter table 表名...