【MYSQL】索引的原理(B+树实现)和操作

目录

 1.MYSQL与磁盘交互的基本单位

2.索引的原理

3.聚簇索引

4.索引操作


认识磁盘 

 1.MYSQL与磁盘交互的基本单位

为了提高基本的IO效率, MySQL进行IO的基本单位是16KB

  • 一次使用16KB(称为page)为单位大于磁道的扇面(521B),那么储存MYSQL的数据就会把16KB的数据连续存储在多个扇面上,那么磁头巡道的次数减少(数据是连续存放的),效率得到了提高;

1.1.数据如何存储到磁盘的

  • MySQL服务器在内存中运行的时候,在服务器内部,就申请了被称为 Buffer Pool 的的大内存空间(通常:128MB),来进行各种缓存。

2.索引的原理

2.1.单个page数据节点

  • page使用双链表的结构来管理;
  • 单个page数据节点由两个指针和数据构成;

 

 2.2.如何提升单个page节点的查找速度--页目录

  • 给page加上一个目录就可以提高查找速度;
  • 每个目录保存主键值(采用最小的主键值保存)和一个指向数据的指针;
  • 每隔多个就做一个目录;

2.3.多个page添加页目录

  • 这个的数据结构叫做B+树;
  • 叶子节点使用双向列表连接起来的,因为数据会排序,可能插入一个节点这个page已满,需要到下一个节点;

 2.3.1.一个非叶子节点可以管理多少个节点;

Q:128MB有多少个page?

A:128*1024/16=8192;

Q:一个page可以管理多少节点?

A:16*1024/8=2048;

那么只需要5个非叶子节点(第一层1个,第二层4个)就可以管理号128MB;

2.4.为什么不用其他的数据结构来设计索引

1.红黑树:它的效率也不低,但是它的树的高度是高于B+树的,所以IO次数更多效率更低;

2.哈希表:哈希表查找单个数据的效率很好,但是如果是范围性查找,查10到100之间的数据,因为它并不会排序那么只能一个个的找,效率并不高;

索引需要树的高度低,来减少IO次数,并且要排序来支持范围性查找

3.聚簇索引

聚簇索引:innodb就是聚簇索引,和B+那个图一样数据   在page内;支持事务

非聚簇索引:myisam就是非聚簇索引,就是page内   是一个指向数据的指针;效率高

3.1.回表查询

如果innodb建立普通索引:需要查询2次,先在普通索引查找到主键,再使用主键在主键索引中查找数据;这样设置是为了防止数据冗余;

myisam就没有这个问题,myisam是非聚簇索引page保存的是指向数据的指针,所以myisam更适合做一些查找的情况;

4.索引操作

查询索引信息

格式:show index from 表名;

4.1.主键索引

创建主键索引

1.创建主键默认创建索引
create table t1 ( id int unsigned primary key auto_increment );
2.后续添加主键也可以
create table t2 ( id int  );
alter table t2 add primary key(id);

删除主键索引

alter table t1 drop primary key;

4.2.普通索引

创建普通索引

1.
create table t3 (id int primary key auto_increment, name char(5),index(name) );
2. 
create table t3 (id int primary key auto_increment, name char(5) );
alter table t3 add index(name);

 删除普通索引

alter table t3 drop index(name);

4.3.唯一键索引的操作和主键一样就是加unique和删除unique;

4.4.索引创建原则:

  1. 比较频繁作为查询条件的字段应该创建索引;
  2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  3. 更新非常频繁的字段不适合作创建索引;(插入效率低)
  4. 不会出现在where子句中的字段不该创建索引;(索引就是用来查询的,如果不在where出现根本就不会查询)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
B是一种用于实现数据存储和检索的数据结构,在数据库系统中广泛应用。它是一种平衡多路搜索,通过在每个节点中存储多个关键字,并以此来区分子节点,从而提高数据检索的效率。 通过使用B,可以实现抽象数据类型(ADT)。比如,我们可以创建一个名为BTree的ADT,其中包含以下操作: 1. 初始化:该操作用于创建一个空的B。 2. 插入:该操作用于向B中插入一个新的关键字。插入操作首先要判断该关键字是否已经存在于B中,如果不存在,则根据B的规则,将关键字插入到合适的位置。 3. 删除:该操作用于从B中删除一个关键字。删除操作首先要判断该关键字是否存在于B中,如果存在,则根据B的规则,删除相关节点,并保持B的平衡。 4. 查找:该操作用于在B中搜索一个关键字。查找操作首先要判断该关键字是否存在于B中,如果存在,则返回该关键字所在的节点。 5. 遍历:该操作用于按照某种顺序遍历B中的所有关键字。遍历操作可以按照升序或降序的方式进行。 通过以上操作,我们可以使用B实现不同的抽象数据类型,例如字典、集合、索引等。在不同的应用场景中,我们可以根据具体的需求,灵活地使用B实现各种功能。同时,B还具有自平衡的特性,能够保持的节点数量相对较少,提高数据检索的效率。 总之,通过使用B实现抽象数据类型,可以有效地组织和管理大量的数据,提高数据的存储和检索效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值