Mysql使用的B+树和存储引擎的关系

Mysql是使用B+树作为索引的数据结构,Mysql有两种不同的数据存储引擎:MYISAM 和 INNODB,在Mysql5.5版本之前采用的是MYISAM,5.5之后采用的是INNODB

首先看看mysql是怎么保存数据的

在/var/lib/mysql这个目录下保存的是所有的数据库

使用MYISAM存储引擎的数据库有三个文件:

.frm 表的定义文件

.MYD 数据文件,所有的数据保存在这个文件中

.MYI 索引文件

在MYISAM存储引擎中,数据和索引的关系如下:

如果要查询id=101的数据,先根据MYI索引文件去找id=101的节点,通过这个节点的数据区拿到真正保存数据的磁盘地址,再通过这个地址从MYD数据文件中加载对应的记录

如果有多个索引,表现如下:

所以在MYISAM存储引擎中,主键索引和辅助索引是同级别的,没有主次之分。

Innodb存储引擎:

Innodb以主键索引来聚集和组织数据的存储,看下Innodb的数据库文件:

.frm 表的定义文件

.ibd 索引文件

没有专门的数据文件,数据都是在叶子节点中,innodb设计的初衷也是也为主键才是最主要的索引

首先看一下聚集索引的概念:数据表中行的数据的物理顺序和键值的逻辑顺序相同

在Innodb中,索引文件是这样的:

叶子节点的数据区保存的是真实的数据,再通过索引进行检索的时候,命中叶子节点,就可以直接从叶子节点中取出行数据

那么在Innodb中,辅助索引和主键索引是怎么表现形式呢?

因为主键索引的叶子节点保存的是真正的数据,辅助索引的叶子节点的数据区保存的是主键索引关键字的值,所以如果按照辅助索引的字段去查询数据,执行的过程是

现在辅助索引中查询到主键id=101,再到主键索引中搜索id=101的数据,最终在主键索引的叶子节点中获取真正的数据,通过辅助索引进行检索,需要检索两次索引

两个不同的存储引擎查找数据的过程:

创建索引的几大原则:

1、列的离散型:
离散型的计算公式:count(distinct col):count(col),离散型越高,选择型越好。

原文地址:https://www.cnblogs.com/wangflower/p/12237846.html

时间: 2024-10-08 21:03:57

Mysql使用的B+树和存储引擎的关系的相关文章

MySQL性能优化(一)-- 存储引擎和三范式

一.MySQL存储引擎 二.存储引擎如何选择 是否支持事务 检索和添加速度 锁机制 缓存 是否支持全文索引 是否支持外键 三.MyISAM和InnoDB对比 四.什么时候使用MyISAM和InnoDB MyISAM:读事务要求不高,以查询和插入为主,例如各种统计表. InnoDB:对事务要求高,保存的是重要的数据,例如交易数据,支付数据等,对用户重要的数据,建议使用InnoDB. 五.配置和数据文件 1.配置文件默认位置 Linux: /etc/my.cnf Windows: my.ini 2.

MySQL查看和修改表的存储引擎

如何查看MySQL的当前存储引擎? 一般情况下,mysql会默认提供多种存储引擎,你可以通过下面的查看: 看你的mysql现在已提供什么存储引擎: mysql> show engines; 看你的mysql当前默认的存储引擎: mysql> show variables like '%storage_engine%'; 你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎): mysql> show create table 表名; 如何查看Mysql服

MySQL详解(2)----------存储引擎

存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能. 例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎.内存存储引擎能够在内存中存储所有的表格数据.又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力). 这 些不同的技术以及配套的相关功能在MySQL中被称

Mysql 性能优化3 如何选择存储引擎

Mysql 使用 插件式存储引擎 Mysql 体系结构 mysql服务层 存储引擎层 都属于存储引擎                            MyISAM 存储引擎    frm 是记录结构的, MYD和 MYI 是MyISAM 特有的   例    表级锁,对数据进行修改时需要全表加锁.读取时也是需要家共享锁.对读写操作并发性不是很好,但是只读的话不怎么影响,共享锁不阻塞共享锁 支持全文索引. 支持text,blob,前500个字符的前缀索引. 如果是只读表的话,就是没有修改操作

MySQL管理之 MyISAM和InnoDB存储引擎简单对比

版权归QQ87006009所有 一.MyISAM引擎: 1.隔离事务界别: 由于myisam的隔离事务级别是串行.采用的是表级锁,不支持事物和全文索引.因此不适用在大并发,重负荷的生产系统上. 2.实例的崩溃恢复: 当系统宕机或者mysql进程崩溃后,MyISAM引擎表很容易受到损坏.不得不用外部命令myisamchk来进行修复. 3.分配内存和使用: myisam引擎内存主要存放索引信息,不存放数据信息,因此在检索表时会先访问索引信息,然后在去磁盘读取数据信息. 4.cpu的使用效率: myi

MySQL查看和修改表的存储引擎(转载+加点东西)

1 查看系统支持的存储引擎 show engines; 2 查看表使用的存储引擎 两种方法: a.show table status from YOUR_DB_NAME where name='YOUR_TABLE_NAME'; b.show create table YOUR_TABLE_NAME; 如果显示的格式不好看,可以用\g代替行尾分号  有人说用第二种方法不准确,我试了下,关闭掉原先默认的Innodb引擎后根本无法执行show create table table_name指令,因为

mysql那些事(5)建表存储引擎的选择

在mysql见表的时候,会遇到选择存储引擎:MyISAM和InnoDB.究竟用哪种存储引擎好呢? 1.MyISAM:表锁:支持全文索引:读并发性能较好. 2.InnoDB:行锁:支持事务,支持外键:写并发性能较好. 实际上,现在大多数的公司里,mysql的规定都是使用InnoDB作为默认存储引擎,除了支持事务和行锁是比较重要的两个原因外,其实MyISAM在实际应用场景中意义也不大,并且一个重要原因是,官方支持力度大.oracle很早就收购了InnoDB,后面又收购了mysql,现在重点发展Inn

MySql性能调优一(存储引擎InnoDB,MyISAM)

区别 MyISAM基于ISAM存储引擎,并对其进行扩展,不支持事务. InnoDB给mysql提供了事物提交.回滚等事物安全的存储引擎. MyISAM采用表级锁.表级锁开销小,加锁快,锁粒度大,冲突概率高,并发度低,不会出现死锁. InnoDB支持表级锁与行级锁,默认为行级锁.行级锁开销大,加锁慢,锁粒度小,冲突概率低,并发度高,会出现死锁. MyISAM读写操作是串行的,如果读写同时操作同一张表,写进程优先获取锁,所以不适合有大量更新与读取操作的项目,适合读操作多的少量数据. InnoDB存储

linux修改配置文件解决mysql中文乱码和指定数据库存储引擎

如题,mysql数据库的中文显示乱码: 先看下原来数据库里的字符编码: mysql> show variables like '%character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | l