索引是資料庫儲存引擎用於快速查詢到指定資料的一種資料結構。
可以用新華字典做模擬:如果新華字典中對每個字的詳細解釋是資料庫中表的記錄,那麼按部首或拼音等排序的目錄就是索引,使用它可以讓我們快速查詢的某乙個字詳細解釋的位置。
在mysql中,儲存引擎也是用了類似的方法,先在索引中找到對應的值,然後再根據匹配的索引值找到對應表中記錄的位置。
之所以在索引在面試中經常被問到,就是因為:索引是資料庫的良好效能表現的關鍵,也是對查詢能優化最有效的手段。索引能夠輕易地把查詢效能提高幾個數量級。
然而,糟糕的索引也同樣會影響查詢效能,當表中的資料量越來越多的時候,索引對效能的影響就越大。在資料量比較少並且負責比較低的時候,糟糕的索引對效能的影響可能不明顯,但是當資料量逐漸增多的時候,效能會急劇下降。
經過前面的介紹,我們就進入正題,了解一下mysql支援的索引型別,以及它們的原理和用法。
不同型別的索引,可以為不同場景提供更好的效能。在mysql中,索引是在儲存引擎層面實現的,而不是在伺服器層面實現的。正如大家所知道,mysql支援多種型別的儲存引擎。所以,在不同儲存引擎中索引的實現方式並不是一樣的,也不是所有型別的索引都被所有儲存引擎支援的,即使多個儲存引擎支援同一種型別的索引,它底層的實現也有可能是不相同的。
b-tree索引是被大多數mysql儲存引擎支援的,在我們討論索引時,假如沒有特別地說明型別,那麼大概率說的就是b-tree索引了。我們使用b-tree這個詞,是因為mysql在建立表和其他語句中就使用這個關鍵字。
然而,在不同儲存引擎的底層可能使用不同的資料結構和演算法,比如:innodb儲存引擎內部使用的是b+tree結構,ndb集群儲存引擎內部使用的是t-tree結構。不同儲存引擎用以不同的方式使用b-tree索引,效能也可能不同,比如:innodb的索引上儲存的是原資料格式,而myisam儲存引擎使用字首壓縮技術使索引更小,innodb索引的行儲存的資料行的主鍵引用,而myisam儲存引擎的索引的行儲存的是資料行的物理位置。
b-tree索引能夠加快訪問資料的速度,因為不需要全表掃瞄就可以快速檢索的需要的資料。那麼b-tree索引是怎麼做到的呢?我們通過乙個簡單的例子了解一下innodb的b-tree索引是怎麼工作的:
create table `om_address` (
`province_name` varchar(255) not null comment '省',
`city_name` varchar(255) not null comment '市',
`district_name` varchar(255) not null comment '區',
`detailed_address` varchar(255) null default null comment '詳細位址',
index `index_province_city_district`(`province_name`, `city_name`, `district_name`) using btree
) engine = innodb;
這個表中共有4個字段,分別表示省、市、區和詳細位址,還有乙個b-tree索引,其中包含了省、市、區三個字段。因為索引的所有值都是按照順序儲存的,即:節點的左子樹比當前節點小,節點的右子樹比當前節點大。那麼當查詢資料時,從索引的根節點開始搜尋,根據比較當前節點的索引值向子樹進行查詢,直到找到對應的索引值,或者根本沒有找到。
根據b-tree索引的特點,它可以用於全值匹配、值範圍匹配和最左字首匹配。
雜湊索引是基於雜湊表實現的,用於精確匹配索引所指向的資料。儲存引擎對每一行資料的所有索引字段計算出乙個雜湊碼,雜湊碼是乙個比較小的值,並且不同的資料計算出來的雜湊碼一般情況下也不一樣。雜湊索引中存放了這個雜湊碼和指向這個資料行的指標。
在mysql中,只有memory儲存引擎支援雜湊索引,也是memory儲存引擎的預設索引型別。另外,在innodb儲存引擎中也運用了雜湊索引,叫做自適應雜湊索引。當某些索引中被非常頻繁的使用時,innodb儲存引擎會在記憶體中基於b-tree索引之上再建立乙個雜湊索引,這樣一來使得b-tree索引也具有的快速雜湊查詢的優點。
雜湊索引因為只需存放對應資料的雜湊值,所以索引的結構非常緊湊,占用空間小,同時查詢速度也非常快。不過,雜湊索引只支援全值等值查詢,不能索引字段範圍匹配和部分索引字段匹配。
空間資料索引(r-tree)主要用於地理資料的儲存,會從所有維度來索引資料,查詢時可以有效的使用任意維度進行組合查詢。 目前,myisam儲存引擎支援空間資料索引,不過必須使用mysql的gis相關的函式來維護資料。
在mysql中,空間索引只能建立在空間資料型別上,如:geometry、point、linestring等。
在相同的字段上,可以同時建立全文索引和b-tree索引,不會有衝突。全文索引適用於match和against操作,不是普通的where條件操作。在mysql中,只能在型別為char、varchar、text的字段上建立全文索引。
5分鐘了解docker
一 概念 開源的應用容器引擎,打包開發者的應用及依賴包在乙個可移植的容器中,相當於沙箱。docker允許開發人員在單個作業系統上隔離和執行多個應用程式,而不是為伺服器上的每個應用程式專用乙個虛擬機器。這是通過將應用程式隔離在單獨的容器中來實現的,這些應用程式雖然被容器分隔開,但是卻可以共享作業系統和...
5分鐘了解位運算
運算子分為6種,它們是 名稱符號 按位與 按位或 按位異或 按位取反 左移運算 右移運算 按位與運算將參與運算的兩數對應的二進位制位相與,當對應的二進位制位均為 1 時,結果位為 1,否則結果位為 0。按位與運算的運算子為 參與運算的數以補碼方式出現。舉個例子,將數字 5 和數字 8 進行按位與運算...
5分鐘搞定快速排序
直接切入主題,快速排序分為兩過程 挖抗填數 分治法 先說下分治法,顧名思義就是 分而治之 的核心思想。簡單舉個例子體會一下 現在有100個人需要按照身高排成一列。首先,定個身高基準1.7m 定得太高和太低都會打破平衡 高與1.7m的都站在一列的右端,低於1.7m的都站在一列的左端。1.7m即為左右端...