索引對於資料庫就像目錄對於書籍。索引對良好的效能非常關鍵,尤其是當表中的資料越來越多的時候,索引對效能的影響愈發重要。索引優化對於優化查詢來說是最重要的乙個手段了, best索引比乙個good索引能優化兩個數量級的效能,由此可見一斑。
一、索引的型別
mysql中的索引是在儲存引擎層面實現的,因而沒有統一的標準,這裡忽略掉這些,只關心mysql索引用到的資料型別。
1、b-tree
在學習資料結構的時候,我們知道樹這種資料結構經常會用來進行查詢的操作,比如二叉樹,平衡樹,紅黑樹,還有b樹,它可以把查詢的時間複雜度優化到對數級別。
一般來說,索引本身也很大,不可能完全存放在記憶體中,所以一般是以索引檔案的方式儲存在磁碟中,因而,在進行索引查詢的時候就會牽扯到磁碟的i/o,而對磁碟的i/o操作的時間遠比記憶體操作要高幾個數量級,所以要找一中能夠有效減少磁碟i/o的資料結構,這就是多路查詢樹。
b-tree的可以按照如下的定義:
1)樹中每個節點至多有m個子節點
2)除根節點和葉節點之外,每個節點至少有m/2個子節點
3)所有葉節點都在同一層
4)每個非葉節點中包含n個關鍵字:
a)關鍵字是有序的
b)pi是指向子樹的指標,這個子樹的所有關鍵字都小於ki,但都大於ki-1
c)關鍵字的個數在區間[m/2,m-1]
上圖是乙個b-tree的例子。
2、b+tree
b+tree是b-tree的乙個變種,也是mysql中實際用到的一種資料結構,他們的區別在於:
1)有n
棵子樹的結點中含有
n個關鍵字;
(b-tree是n
棵子樹有
n-1個關鍵字
)2)所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序鏈結。
(b-tree
的葉子節點並沒有包括全部需要查詢的資訊
)3)所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。
(b-tree
的非終節點也包含需要查詢的有效資訊
)上圖是乙個b+tree的例子。
3、雜湊索引
雜湊索引是基於雜湊演算法的一種精確的索引。在mysql中只有memory引擎顯示支援雜湊索引,這也是memory引擎的預設索引方式,它同時也支援b-tree。值得一提的是它支援非唯一雜湊索引,如果多個列的雜湊值相同,則用乙個鍊錶儲存。
因為雜湊索引只儲存雜湊值,所以索引的結構十分的緊湊,者也是其查詢速度非常的快,但同時也有了如下的問題:
1)雜湊索引中只包含雜湊值和資料指標,不包含資料分身。因而還需要查詢一次資料。不過在記憶體中的插敘速度很快,這點可以忽略。
2)雜湊索引並不是順序儲存的,所以無法進行排序。
3)雜湊索引也不支援部分索引列的查詢,因而雜湊值是根據所有索引列計算的。
4)由於雜湊值是個準確的值,所以只能進行等值查詢,無法進行模糊查詢
5)在有衝突的時候,效率會明顯下降。
因而,雖然雜湊索引能夠帶來很大的效率的提公升,但是它只能在一些特定的場合進行使用。
mysql5 7初步使用 MySQL使用初步知識
一 建立資料庫 create database database name php中建立資料庫的兩種方法 mysql create db mysql query conn my 一 建立資料庫 create database database name php中建立資料庫的兩種方法 mysql cr...
mysql安裝初步 mysql 安裝與初步介紹
mysql的安裝與配置 mysql 埠號3306 basedir c program files mysql mysql server 5.5 基礎安裝目錄 datadir c programdata mysql mysql server 5.5 data 以後資料檔案儲存目錄 修改配置檔案 c p...
初步學習 mysql
資料庫 database 是按照資料結構來組織 儲存和管理資料的倉庫 資料管理不再僅僅是儲存和管理資料,而轉變成使用者所需要的各種資料管理的方式。資料庫有很多種型別,從最簡單的儲存有各種資料的 到能夠進行海量資料儲存的大型資料庫系統都在各個方面得到了廣泛的應用。在資訊化社會,充分有效地管理和利用各類...