講到mysql,那麼索引肯定是繞不開的話題,大家平時工作中應該也經常接觸。索引,簡單點概括,就是為了提高資料的查詢效率,就像書的目錄一樣
常見的索引模型:
雜湊索引:是一種鍵-值(key-value)的資料結構索引。雜湊的思路很簡單,把值放在陣列裡,用乙個雜湊函式把 key 換算成乙個確定的位置,然後把 value 放在陣列的這個位置。
缺點:key的hash衝突問題;範圍查詢要遍歷全部資料;如果是有序陣列,查詢範圍查詢雖然很快,但是更新資料時候就很麻煩
二叉搜尋樹:樹形結構,每個節點的左兒子小於父節點,父節點又小於右兒子。查詢時間複雜度為o(logn)。
在某些極端情況下,樹可能會變成線性。為了保證查詢時間複雜度為o(logn),這個時候又會有平衡二叉樹。
為了減少和磁碟的io,後面有引入了n叉樹,通過降低樹的高度方式減少磁碟io。
innodb 的索引模型
innodb使用的是b+樹的索引模型,每乙個索引在 innodb 裡面對應一棵 b+ 樹。
例:
#1.新建一張表t,給字段k加上索引
create
table t(
id int
primary
key,
k int
notnull
,name varchar(32
),index
(k))
engine
=innodb
;#2.新增些資料
那麼這張表中就有兩棵樹:1.主鍵索引id欄位的樹,2.非主鍵的k欄位索引樹
兩棵樹如下圖:r1~r5表示的是表中第幾行整行資料
主鍵索引的葉子節點存的是整行資料
。在 innodb 裡,主鍵索引也被稱為聚簇索引
(clustered index)。
非主鍵索引的葉子節點內容是主鍵的值
。在 innodb 裡,非主鍵索引也被稱為二級索引
(secondary index)
基於主鍵索引的查詢和普通索引的查詢區別:
因為基於非主鍵索引的查詢需要多掃瞄一顆索引樹,因此我們盡量使用主鍵索引查詢比較好。索引的維護
由於每個非主鍵索引的葉子節點都是主鍵的值。所以如果主鍵長度越小,普通索引的葉子節點就越小,普通索引占用的空間也越小。
例如有一張使用者表,使用者身份證號碼也是唯一的,也可以用來做主鍵,那你是新增加乙個自增的id欄位作為主鍵好呢?還是用身份真號碼作為主鍵好呢?
從效能和儲存空間方面考量,自增主鍵往往是更合理的選擇。
有些場景也可以用業務字段做主鍵:
只有乙個索引
該索引必須是唯一索引
例如上面說的這個例子,如果確定表就只有乙個索引。由於沒有其他索引,所以也就不用考慮其他索引的葉子節點大小的問題。那麼這個時候用身份證號碼作為主鍵還是很合理的。
而且,通過身份證號碼查詢的時候,還可以避免回表
情況發生。(符合盡量使用主鍵查詢
的原則)
索引重建
1.為什麼要重建索引?
MySQL索引之B 樹索引
b 樹索引是是目前關係型資料庫系統中查詢最為常用和最為有效的索引,b 樹的索引構造類似於二叉樹,根據鍵值 key value 快速找到資料。1 什麼是b 樹?首先,b 樹中的b並不是二叉樹 binary 的意思,這裡的b表示的是blance即平衡的意思。那麼b 樹其實就是平衡查詢樹。其滿足兩個條件 ...
Mysql索引B 樹,索引優化
索引是幫助mysql高效獲取資料的排好序的資料結構 mysql底層資料結構 b tree 特點 儲存引擎 99 innodb,早期myisam mylasm儲存引擎磁碟檔案 用途tb myisam.myi index,儲存的索引,b 樹 tb myisam.myd data,儲存的資料 tb myi...
Mysql中的B樹索引和B 樹索引的區別?
參考原文 b樹可以在內部節點同時儲存鍵和值,因此,把頻繁訪問的資料放在靠近根節點的地方將會大大提高熱點資料的查詢效率。這種特性使得b樹在特定資料重複多次查詢的場景中更加高效。由於b 樹的內部節點只存放鍵,不存放值,因此,一次讀取,可以在記憶體頁中獲取更多的鍵,有利於更快地縮小查詢範圍。b 樹的葉節點...