資料庫(3)資料庫索引

2021-08-21 00:13:42 字數 3919 閱讀 2799

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。

1.2 從索引的底層資料結構來看:b+樹索引和hash索引

1.2 從索引的建立方式:主鍵索引,唯一索引,普通索引,組合索引和全文索引

二.查詢時會使用索引的情況

三. 查詢時不會使用索引的情況

四. 推薦建立索引的列

五. 最左字首原則

還是寫在前面,網上部落格說了很多的索引型別,有些不知所云有些人云亦云,什麼聚集索引,b+樹索引,雜湊索引,主鍵索引,唯一索引等等很多,一看是我看到的時候也是一臉懵逼,直到學習很多以後,才有了一些體系性的東西,故整理出來,希望幫助大家理解。

當然如果有謬誤,也請批評指正。

聚集索引指的是索引的一種組織形式,而且是一種sql規範。

聚集索引的定義:資料行在硬碟上的物理儲存順序和資料表中的邏輯儲存順序相同,乙個表只能有乙個聚集索引。

上圖模擬了聚集索引的儲存形式,如果我們在資料行id上建立聚集索引,那麼整個表在磁碟上的儲存順訊,就是按照表中id的順序進行儲存。

同時也是因為這個原因,一張表上只能有乙個聚集索引。

在mysql中,innodb引擎預設按照主鍵索引進行聚集,當沒有主鍵時,innodb會以唯一的非空索引來代替,如果沒有主鍵也沒有唯一的非空索引,innodb會生成乙個隱藏的主鍵索引,然後在上面進行聚集。

所以主鍵(索引)的建立(聚集索引),盡量在建立表時建立,如果後續新增,資料庫會根據聚集索引將磁碟的資料重新排列,以確保資料的物理儲存順序和索引列在表中的邏輯順序相同。

聚集索引的查詢過程。

聚集索引的葉子結點就是對應的資料結點,可以直接查詢到全部列的資料。

也就是說聚集索引的葉子結點儲存結構就是資料在硬碟上的儲存結構。

非聚集索引和聚集索引很明顯是相對立的概念。

非聚集索引的索引邏輯順序和磁碟上儲存的物理順序不同,乙個表可以有多個非聚集索引。

我們從上圖可以看出,非聚集索引生成b+樹的葉子結點,是建立索引的資料列和對應的資料行所在的位址。

也就是說如果建立非聚集索引,要查詢建立索引列外的資料,需要進行二次檢索。而聚集索引就不會出現這種情況,因為聚集索引的葉子結點就是全部的資料內容。

對於mysql來說,我們平時對於某列或者多列建立的索引,就是非聚集索引,而innodb引擎中,因為必須有聚集索引,所以非聚集索中包括聚集索引的列(一般是主鍵列),innodb的二次查詢,其實第二次是進行了聚集索引的檢索查詢。

b+樹是一種二叉查詢樹的變種,同時也是b樹的公升級版本。具體b樹和b+樹這種資料結構,我準備這幾天整理一下發出來。

b+樹索引就是基於b+樹的一種索引方式,這種方式極大地減少了硬碟io的次數,得益於b+樹優良的性質,資料庫只需要幾次查詢就能從大量資料中得到特定的儲存資料。

資料庫中的索引一般都是b+樹索引,我上面提到的聚集索引和非聚集索引就是b+樹索引。

對於mysql來說,innodb和myisam引擎,建立的索引都是b+樹型別的索引。b+樹索引支援=,>,等條件查詢方式。

hash索引是基於hash表的一種索引,至於雜湊表,參考雜湊表這篇博文。

mysql中支援hash索引的資料庫引擎有memory引擎。

hash索引只支援=的條件,對於那些範圍查詢,根據雜湊表的性質,明顯是不支援使用hash索引進行查詢的。

主鍵索引:主鍵索引很明顯就是主鍵約束的實現方式,這種索引要求建立索引的內容不能相同而且不能為空。在mysql中主鍵索引預設是聚集索引,因此查詢速度更快。

唯一索引:唯一索引是唯一性約束的實現方式,這種索引要求建立索引的內容不能相同但可以為空,在mysql中,建立唯一索引和新增唯一性約束效果是一致的。唯一索引可以是聚集索引(innodb中),也可以是非聚集索引。

普通索引:普通索引就是我們平常建立在資料上的索引,一般是非聚集索引,在innodb中普通索引中含有主鍵索引的內容和建立索引的資料內容。組合索引:組合索引是多列共同建立的索引,要建立符合最左字首原則的組合索引。全文索引:全文索引是針對文字內容建立的索引,要指定索引的長度,通過like條件查詢時可以使用,但是要滿足不能有前導模糊查詢的情況。

sql什麼條件會使用索引?

當字段上建有索引時,通常以下情況會使用索引:

index_column = ?

index_column > ?

index_column >= ?

index_column < ?

index_column <= ?

index_column between ? and ?

index_column in (?,?,…,?)

index_column like ?||』%』(後導模糊查詢,這個是針對全文索引)

t1. index_column=t2. column1(兩個表通過索引字段關聯)

所謂最左字首原則指的是,建立組合索引時,例如

alter table `table_name` add index index_name (`col1`,

`col2`,

`col3` )

那麼查詢時,如果where col1 = 1 and col2=2這種條件語句查詢,可以使用組合索引進行查詢。

但是如果where col2 = 2 and col3 = 3這種條件語句,就不會使用組合索引查詢。

也就是說要滿足從左向右的索引順序進行匹配,如果沒有左面的列而有右面的列,那麼就不滿足最左字首原則。

你可以認為聯合索引是闖關遊戲的設計

例如你這個聯合索引是state/city/zipcode

那麼state就是第一關 city是第二關, zipcode就是第三關

你必須匹配了第一關,才能匹配第二關,匹配了第一關和第二關,才能匹配第三關

你不能直接到第二關的

索引的格式就是第一層是state,第二層才是city

索引是因為b+樹結構 所以查詢快 如果單看第三列 是非排序的。

多列索引是先按照第一列進行排序,然後在第一列排好序的基礎上再對第二列排序,如果沒有第一列的話,直接訪問第二列,那第二列肯定是無序的,直接訪問後面的列就用不到索引了。

資料庫 資料庫索引

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

資料庫 資料庫索引探索

資料庫的資料儲存在磁碟中,當使用者或者程式通過dbms查詢資料庫某條記錄時,就會將磁碟中對應的資料讀取到記憶體中。但是問題是,假如所查詢的表的資料量很大,而記憶體是有限的,在沒有索引的情況下,查詢將對整個表進行掃瞄,就需要多次io讀取磁碟中的資料,通過 遍歷 資料塊的方式找到需要的記錄。這個效能消耗...

資料庫 資料庫索引原理

正確的建立合適的索引 是提公升資料庫查詢效能的基礎 4.b tree 在兩大引擎中的體現 5.索引的原則 索引是為了加速對錶中資料行的檢索而建立的一種分散儲存的資料結構。索引能極大的減少儲存引擎需要掃瞄的資料量 索引可以把隨機io變成順序io 索引可以幫助我們在進行分組 排序等操作時,避免使 用臨時...