- N +

數據庫索引實現原理 MySQL索引有哪幾種類型

大家好,今天小編來為大家解答以下的問題,關于數據庫索引實現原理,MySQL索引有哪幾種類型這個很多人還不知道,現在讓我們一起來看看吧!

數據庫的索引有什么用

索引是數據庫優化所必需的工具,在面試的時候一般不會問概念性的問題,因為大家都能從教科書上找到答案,所以一般會問以下兩方面的問題:

①索引有什么代價?哪些場景下你需要建索引?或者有時候反過來問,哪些場景下不推薦建索引。

②建好索引之后,怎么才能最高效地利用索引?或者反過來問,請說出一個無法有效利用已建索引的案例。

從結構上來看,索引好比是一棵B樹(也叫B*或者B+),假設學生表里只有學生ID和姓名兩列,該學生表里有1000個學生,學號分別從1到1000,如果針對ID建立索引,大致的結構如下圖所示。

當然,在實際的數據庫系統中,索引要比這個復雜得多,但從這個圖里,我們能大致看出索引的工作原理。

索引建好后,如果我們要查找ID為111的學生,則數據庫系統就會走索引,從圖2.1中我們可以看到,根據根節點的指引,會找到第二層從左往右第二個數據塊,以此類推,會在第四層里得到ID為111的物理地址,然后直接從硬盤里找數據。

反過來,如果沒有建索引,數據庫系統可能就要從一個大的范圍里逐一定位查找,效率就沒這么高了。

MySQL是如何利用索引的

什么是索引?

索引是數據庫快速找到記錄行的一種數據結構,類似我們看書時的目錄,它是良好性能的關鍵因素。尤其是表中的數據量越來越大時,如果索引使用不當,會嚴重影響性能。索引也是最常見的數據庫優化手段,它能輕易的將查詢性能提高好幾個量級。

MySQL索引類型?

mysql索引數據是存儲在存儲引擎中的,所以不同存儲引擎中索引的工作方式并不一樣。

B-Tree索引:基于B+樹(一種多叉搜索數樹)來實現的索引類型,一般也是使用的最多的索引類型,之所以選擇B+樹而不是其他數據結構,是因為B+樹在查詢時間復雜度可以維持在O(logn)的級別上,由于B+的矮胖(從根節點到葉子節點的距離可以維持在較小范圍)特性減少磁盤IO次數、數據只存在葉子節點中并且按順序存儲也可以支持快速的范圍查詢,這是其他結構無法滿足的!

B+索引中值是按順序存儲的,葉子節點到根節點的距離都相同,從B+樹的根節點開始往下查找,節點存儲了指向葉子節點的指針,通過將要查找的值和每個節點值比較后,一層層定位到最終的葉子結點上,葉子節點存儲的就是行數據、指針或主鍵。

假如我們索引列是:

key(lastname(姓),firstname(名),born),可以使用B+樹索引的查詢類型包括:全鍵值、鍵值范圍、鍵前綴查找,其中鍵前綴只適用于最左前綴查找:

全值匹配:指的是和索引中所有的列進行匹配,如可以找到姓名為:Cuba(名)Allen(姓)、生于1988-10-04的人,如wherelastname=‘Allen’andfirstname=‘Cuba’andborn='1988-10-04'匹配最左前綴:可以查找姓為Allen的人,如wherelastname=‘Allen’匹配列前綴:也可以匹配某一列的值的開頭部分,如wherelastnamelike‘A%’或者wherefirstnamelike‘M%’匹配范圍:可以匹配姓在Allen和Bill之間的人精確匹配某一列并匹配另外一列:查找所有姓為Allen、并且名字是以M開頭的人,如wherelastname=‘Allen’andfirstnamelike‘M%’訪問索引數據:這種查詢只需要訪問索引本身就行了,不需要訪問數據行,也就是常說的索引覆蓋,舉個例子:如果只需要找到姓為Allen的人的名稱,而不需要這個人其他的信息,名稱就存在與索引中,不需要再去數據行中查找數據了。

這里需要注意的是葉子節點存什么類型數據不同的存儲引擎還不一樣,在MyISAM中葉子節點存儲的是數據物理位置(指針),而InnoDB使用B+結構存儲的是原始數據或主鍵,也就是我們常說的聚簇索引,它存儲的是原始全量數據、鍵值,聚簇索引指的是一種數據索引組織形式,它將數據和索引聚集在一起所以叫聚簇,它本身并不是一種索引類型。

一般InnoDB查找過程為從輔助索引上開始查找到數據主鍵,然后在主鍵索引中用主鍵再次查找,最后再找到數據,雖然多了一次查找過程,但更新數據不會導致聚簇索引頻繁變化。而在MyISAM中不需要2次索引查找,因為葉子節點存儲的是數據的物理地址可以直接定位,雖然查詢看似簡單了,但是物理地址會因為數據頻繁變更而發生變化。

假設有以下數據:

InnoDB(聚簇索引)數據查找過程:

MyISAM(非聚簇索引結構)數據查找過程:

哈希索引:基于哈希表來實現的索引類型,如果存在哈希沖突,索引會使用鏈表來存放多個記錄到一個哈希桶中。舉個例子:如果存在以下索引keyUSINGHASH(firstname),哈希索引會使用哈希函數計算出firstname列的哈希值作為key,并將行指針作為value存儲,當使用=、IN()、<=>操作時,先計算出sql語句操作查找值的哈希值,并使用其來查找哈希表對應的行指針,從而返回數據。

這里需要注意是:

哈希索引只存儲哈希值和行指針,索引索引本身沒有行數據,也就沒有所謂的索引覆蓋。哈希索引沒有按哈希值的順序排列,所有不支持排序操作。不支持部分索引列的匹配,哈希索引使用你指定的全部列來計算哈希值,列入(A,B)如果查詢只有列A,則索引無發匹配。哈希索引只支持等值比較(=、in(),<=>)。哈希沖突較高時,查找效率就變成了鏈表,復雜度從O(1)變為O(n)。

空間數據索引:MyISAM支持空間索引可以用來存儲地理數據。必須使用GIS相關函數如MBRCONUNTAINS()來維護數據,因為本身mysql對GIS的支持下不完善,這中特性使用很少。

全文索引:這是一種特殊類型的索引,他查找的是索引列中文本的關鍵詞,而不是比較索引值,全文索引的使用要注意列的文本大小和數據量,它的匹配方式類似于搜索引擎。

索引的優缺點?大大減少了服務器掃描表的數據量。避免不必要的排序和臨時表。將隨機IO變為順序IO。對于非常小的表,全表掃描可能比索引更快,對于中型數據量表,索引將會非常有效,對于TB級別的表來說,索引的維護和效果可能沒有我們想象的那樣好,這是可以使用表分區、業務拆分表和分庫等技術。常見的索引優化方式及注意事項?不要把索引的列納入表達式,也不能是函數參數,如whereaid+1=5、whereto_days(col)<=10.選擇重復性較低的列建索引,重復性較高會導致索引失效,全表掃描。多列索引中很多常見的錯誤是,喜歡為每個列創建獨立索引,實際上這是錯誤的!要選擇合適的順序和列來合并索引,來看個簡單例子:

表數據為:

分別建2個獨立索引:inx_name,inx_company:

現在執行以下語句:

SELECT*fromtuserwhere`name`='22'orcompany='bb'

結果顯示并沒有使用索引來查詢數據:

現在加一個多列索引:inx_name_company

執行同樣的sql顯示使用了多列索引:

不要在大文本字段建全量索引,這會然導致索引數據較大,查詢較慢,可以建一個前綴索引,例如

//在city列上取前7個字符作為索引mysql>altertabledemoaddkey(city(7))

這是一種使索引更小,更快的方法,但缺點是無法使用綴索引orderby或groupby

位圖索引的存儲原理

位圖索引是一種使用位圖的特殊數據庫索引。

主要針對大量相同值的列而創建(例如:類別,操作員,部門ID,庫房ID等),

索引塊的一個索引行中存儲鍵值和起止Rowid,以及這些鍵值的位置編碼,

位置編碼中的每一位表示鍵值對應的數據行的有無.一個塊可能指向的是幾十甚至成百上千行數據的位置.

這種方式存儲數據,相對于B*Tree索引,占用的空間非常小,創建和使用非常快.

當根據鍵值查詢時,可以根據起始Rowid和位圖狀態,快速定位數據.

當根據鍵值做and,or或in(x,y,..)查詢時,直接用索引的位圖進行或運算,快速得出結果行數據.

當selectcount(XX)時,可以直接訪問索引就快速得出統計數據.

創建語法很簡單,就是在普通索引創建的語法中index前加關鍵字bitmap即可,例如:

createbitmapindexH病人掛號記錄_ix_執行人onH病人掛號記錄(執行人);

es的索引最詳細原理

ES將數據存儲于一個或多個索引中,索引是具有類似特性的文檔的集合。類比傳統的關系型數據庫領域來說,索引相當于SQL中的一個數據庫,或者一個數據存儲方案(schema)。

索引由其名稱(必須為全小寫字符)進行標識,并通過引用此名稱完成文檔的創建、搜索、更新及刪除操作。一個ES集群中可以按需創建任意數目的索引。

數據庫存儲原理和結構

是指數據庫如何在磁盤上存儲數據的方式。一般情況下,數據庫系統通過數據管理軟件來實現對數據的存儲、管理及訪問。以下是數據庫存儲原理和結構的基本概念:

1.數據文件:數據庫中存儲數據的基本單位,是物理上存在于磁盤上的文件。一般來說,每個數據文件對應著一個表或索引。

2.表空間:是由多個數據文件組成的邏輯存儲單元,用于對數據文件進行管理以及對表和索引進行分配和管理。可以將表空間看做是一個大容器,用來存儲所有的數據文件和對象。

3.段:即為了方便管理和存儲而將表空間分成若干個部分的邏輯單位,也可以稱之為分區。每個段都包含了一組數據塊,并且只能屬于一個表空間。

4.數據塊:是數據庫中最小的存儲單位,一般大小為2K、4K、8K等。每個數據塊都有一個唯一的地址,可以存儲一定數量的記錄。在硬盤上讀寫數據時,操作系統會以數據塊為單位進行傳輸。

5.記錄:存儲在數據庫中的基本數據單元,通常對應于表中的一行數據。每個記錄包含一組字段,用來描述記錄所代表的實體。

6.段類型:數據庫會將不同類型的對象存放在不同類型的段中。比如,數據表存儲在數據段中、索引存儲在索引段中、Lob(大對象)存儲在Lob段中等。

7.索引:為了提高數據訪問的效率,數據庫通常使用索引來加速查詢操作。索引本身也是一種特殊的數據結構,在硬盤上也有相應的存儲形式。

綜上所述,數據庫的存儲原理和結構主要包括數據文件、表空間、段、數據塊、記錄、段類型和索引等基本概念。不同的數據庫系統在實現上可能存在著一定的差異,但基本框架和原理大致相同。了解這些概念對于理解數據庫的工作原理及進行數據庫性能優化等方面非常重要。

好了,關于數據庫索引實現原理和MySQL索引有哪幾種類型的問題到這里結束啦,希望可以解決您的問題哈!

返回列表
上一篇:
下一篇: