MySQL高級篇之索引介紹&原理解析

一,索引簡介

什麼是索引?
通俗易懂來說:
是一種數據結構,一種幫助MySQL高效獲取數據的數據結構。
      以上是官方對於索引的解釋,其實我們也可以將其理解爲—排好序的快速查找數據結構,通常人們會將索引比喻爲新華字典的目錄,那麼這裏結合目錄來理解這句話就會很容易了!
既然我們已經知道了,索引是一種類似目錄的數據結構,那麼接下來就來看看索引是如何存放的吧!
      一般需要用到索引的情況,都是數據量很大的表,因此,索引這種數據結構本身也有點大,固不能全部存放在內存中,往往會以索引文件的形式,存放在磁盤上
從數據庫結構來說:
       數據庫除了維護數據之外,還維護着滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據;
這樣我們就可以在這些數據結構上實現查找算法,這種數據結構就是索引。下圖所示一種可能的索引示例
左邊是數據表(數據記錄的物理地址)
在這裏插入圖片描述
要查詢id爲5的sum總和
不使用索引,要逐一查找
使用索引,只需要比較兩次就可以查詢出對應的數據-------------這裏採用了二叉查找樹的結構,從而可以快速的檢索出符合條件的記錄

二,索引類別
      前面我們已經知道了索引是個什麼東西以及索引是如何存放的,接下來我們就來看看索引的類別和索引的基本操作吧!
首先來說說索引的三大類別
三大類
單值索引:
一個索引對應一個字段,該字段可以爲空
唯一性索引:
一個索引對應一個字段,且該字段不能爲空時
複合索引:
一個索引鍵對應多個字段

創建索引的方法有兩種:
第一種:
create index indexName on tableName(columnsName,columnsName)
字段名column是Name爲一個時,爲單值索引
加上約束UNIQUE時,爲唯一性索引
create unique index indexName on tableName(columnsName)
第二種:
alter table tableName add index indexName(columnsName,columnsNames…)
唯一性索引
alter table tableName add unique index indexName(columnsName)

刪除索引:
drop index indexName on table

查看索引:
show index from tableName

三,索引解析
索引的結構有四種

  • BTree索引
  • Hash索引
  • full-testt全文索引
  • R-Tree索引
    由於本人是研發不是DBA,工作中會涉及的基本只有BTree樹,所以接下來就主要講解BTree索引結構

這裏其實有需要注意的地方,我們上面舉的例子是單值索引的例子,那麼複合索引的結構是如何的呢?
單值索引建立了一棵樹,那麼複合索引是不是要建立多顆樹呢?
答案 :跟着下面繼續看就會知道了!!!
(這裏注意:BTree的意思是多路搜索樹,並不一定是二叉樹結構。)
爲了便於理解,我們接下來做一個實操,看完相信大家就可以明白了:
創建一個表xxxtent,插入數據,建立索引,查看idb文件中的數據
create table xxxtent(
id int,
age int)engine=innodb;

insert into xxxtent values(‘1’,‘10’);
insert into xxxtent values(‘2’,‘11’);
insert into xxxtent values(‘3’,‘12’);
insert into xxxtent values(‘4’,‘13’);

create index ind_id_age on xxxtent(id,age);

show index from xxxtent
打開數據安裝地址的data目找到對應的數據庫表,打開xxxtent.idb文件,可以可看到如下數據
80 00 00 01 80 00 00 10 00 00 01 57 8B 08 00 00
00 18 00 14 80 00 00 02 80 00 00 11 00 00 01 57
8B 09 00 00 00 20 00 14 80 00 00 03 80 00 00 12
00 00 01 57 8B 0A 00 00 00 28 FF B6 80 00 00 04
80 00 00 13 00 00 01 57 8B 0B 00 00 00 00 00 00
00 00
從上面可以觀察到:
80 00 00 01 80 00 00 10
80 00 00 02 80 00 00 11
80 00 00 03 80 00 00 12
80 00 00 04 80 00 00 13
分別對應(1,10)(2,11)(3,12)(4,13)
所以說,當索引未複合索引時,其同樣只會建立一顆樹,不同的是,節點從之前的單值變成了複合值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章