【MYSQL的存储引擎】

本文详细介绍了MySQL的存储引擎,重点关注默认引擎InnoDB与MyISAM的区别。InnoDB支持事务处理、外键和行级锁,适合高并发场景;MyISAM则在非事务场景下提供更快的查询和添加操作。此外,文章还探讨了InnoDB的数据存储结构,包括B+树的实现和页的内部结构。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、MySQL默认存储引擎

1.1 什么存储引擎?

存储引擎其实就是指定表的类型,存储引擎决定了数据的存储底层结构,一些特殊的处理特性,插入修改数据的操作也就有所不同,也就是决定了表的特性。

1.2 mysql的存储引擎

MYSQL在5.5之前都在使用MYISAM这种存储引擎,而在5.5之后都在使用INNODB。

我们可以先看看mysql中有那几种存储引擎,我使用的mysql版本为8.0.2。

查看数据库的存储引擎

show engines;

Engine存储引擎的名字
Supportmysql该版本是否支持该存储引擎
Comment注释
Transactions是否支持事务
XA是否支持分布式事务
Savepoints是否支持事务的回滚

可以看到,在mysql8中一共支持8个存储引擎,我们主要将MYISAM和INNODB的两个存储引擎。

同时,我们也可以查看一下mysql中的默认存储引擎来证实上面的话。

show variables like '%storage_engine%';

default——storage_engine也就是数据默认使用的存储引擎策略。其实在mysql,启动的时候会去读取配置文件,来给这些系统的全局变量赋值,在我们可以指定相应的存储引擎,来满足我们各种各样的需求。若改动配置文件,则一直保持该改动的值,若在命令行改的话重启后恢复原来的默认值。

在mysql的配置文件中也就是mysql.ini中

 在命令行中修改

SET DEFAULT_STORAGE_ENGINE= 要修改的存储引擎;

建表的时候就会根据默认的存储引擎进行见表。但是修改存储引擎后,原来根据前一个存储引擎建的表还会保留原来的,这时候就需要手动去修改表的存储引擎,我们也可以在建表的时候显示指定存储引擎。

CREATE TABLE 表名(
    建表语句; 
) ENGINE = 存储引擎名称;
ALTER TABLE 表名 ENGINE = 存储引擎名称;

二、MYISAM和INNODB的对比

 我们就拿两个最经典的进行对比,这两个也是mysql不同版本的默认存储引擎。

事务的支持,外键,表锁与行锁,缓存,B+树总结

存储引擎MYISAMINNODB
事务
外键
行表锁表锁行锁
缓存只存索引索引和数据一起存
B+树的存储节点存数据的地址然后回表存真实数据
总结占用空间少,操作简单,快速高并发,事务
  • 从上表中,我们可以知道INNODB是支持事务,对一些特定的业务场所有非常大的优势,同时它也是支持回滚的,在mysql宕机时,重启后能够恢复到最近一次提交。
  • 外键的支持,能够满足一定场所的业务支持,但是在实际开发中,一般不使用外键,因为外键会导致查询修改的效率变低,而且外键一旦多了也不好维护。
  • INNODB支持行锁,相对MYISAM的细粒度更加低,在对操作时,它只锁定对应一行的数据,而MYISAM整是锁定整张表的数据,所以在高并发的场合下,INNODB的性能更佳。
  • 缓存,关于缓存,其实mysql8后就也就废弃缓存了,因为缓存的命中率太低了,mysql的缓存是基于对sql语句的缓存,也就是说两次sql操作必须是一摸一样,查个空格都会继续走解析sql语句。对于INNODB的话是将索引和真实实际一起存储,其实这和其存储的结构有关,下面会细说。
  • 总结,所以在高并发和事务的场景下,我们尽量使用INNODB存储引擎。在对事务不要求的情况下,我们也可以使用MYISAM,因为它的非事务操作(查询和添加)效率要更加高。

INNODB的数据存储

接下来,是对底层数据的存储,所以需要有一些数据结构的基础

首先,INNODB和MYISAM它们在内存中存储数据的结构都是用B+树,通过内存和磁盘的IO操作来完成数据的操作。所以下面先来简单地说一下这个b+树。

大概结构

 它在构建树时,是根据从根节点开始构建的,对于叶子节点,是以一页一页为单位存储的,对于一页数据,mysql是默认16kb,当然,不同的数据库也可能不一样。而在一页面中,是一行一行的数据,它们是以单向链表来连接的,同时,不同页之前的数据也会前后连接。在构建树时,会保证行与行之前是保证顺序的。对于不同的页则使用双向链表来连接。如果看不懂的建议先学习一下b+树。

关于这个页的机结构

对应

描述

文件头记录了页的一些基础信息和校验和
文件尾同上
数据的记录真实数据的行记录
最大最小记录最大和最小的数据记录,有特定值记录0为普通记录,1为非叶子记录,2为最小值,3为最大值
空闲空间页中空余的空间,与上面两个组合成为一个页的所有行记录
页目录就是检索时对页内数据分组,能够方便检索(最小值一组,普通数据1-8,最大值的那组1-5)
页头记录一些页的信息

文件头和文件尾在操作IO时起到关键数据,因为他们都有一个共同的数据就是校验和。这个检验和是用于写入磁盘时的一个标志,在一页中,头和尾的校验和相等,它们的存在就是为了保证页数据的完整读入,确保数据的连续性。比如,在读入数据中突然宕机,头读进去了,但是尾还没读进去,就可以查看是否存在尾的校验和,若不存在必须进行数据调整,若那未读入的一部分还存在,还可以继续进行写入操作,若无只能进行回滚了。

在检索数据时,找到对应页,它会遵循抽取原则进行二分查找,其过程大概就把里面的数据分成1-8条数据为一组,然后把最大的数字提取出来,然后进行二分查找,找到对应数字的那组在进行查找,这样做能够节省空间,不用一下子就读取一整页的数据,节省了一定的空间。

后面还会涉及到关于行记录,也就是行记录结构。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值