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)
所以说,当索引未复合索引时,其同样只会建立一颗树,不同的是,节点从之前的单值变成了复合值

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