MySQL数据库之存储引擎

news2024/11/15 21:31:24

MySQL数据库之存储引擎

  • 数据存储引擎介绍
  • MyISAM数据引擎概述
    • MyISAM的特点介绍及数据引擎对应文件
    • MyISAM的存储格式分类
    • MyISAM适用的生产场景举例
  • InnoDB数据引擎概述
    • InnoDB特点介绍及数据引擎对应文件
    • InnoDB适用生产场景分析
    • 企业选择存储引擎的依据
  • 如何配置存储引擎
    • 查看系统支持的存储引擎
    • 查看表使用的存储引擎
  • 补充
    • 表锁与行锁
    • InnoDB使用表级锁定的场景
    • 行锁的示例
    • 表锁的示例
    • 死锁的示例
    • 如何避免死锁?

数据存储引擎介绍

  • MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能MySQL中称为存储引擎

  • 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
    MySQL常用的存储引擎

    • MyISAM
    • InnoDB
  • MySQL数据库中的组件,负责执行实际的数据I/O操作

  • MySQL系统中,存储引擎处于文件系统之.上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MyISAM数据引擎概述

MyISAM的特点介绍及数据引擎对应文件

  • MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的

  • 访问速度快,对事务完整性没有要求

  • MyISAM适合查询、插入为主的应用

  • MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展分别为:

    • .frm文件存储表结构的定义
    • 数据文件的扩展名为.MYD(MYData)
    • 索引文件的扩展名为.MYI(MYIndex)
  • 表级锁定形式,数据在更新时锁定整个表

  • 数据库在读写过程中相互阻塞

    • 会在数据写入的过程阻塞用户数据的读取
    • 也会在数据读取的过程中阻塞用户的数据写入
  • 数据单独写入或读取,速度过程较快且占用资源相对少

  • MyIAM支持的存储格式

    • 静态表
    • 动态表
    • 压缩表
      在这里插入图片描述

MyISAM的存储格式分类

① 静态(固定长度)表

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

② 动态表

动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期数据库中执行SQL语句 OPTIMIZE TABLE 语句或命令行输入 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

③ 压缩表

压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

MyISAM适用的生产场景举例

  • 公司业务不需要事务的支持
  • 单方面读取或写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差

InnoDB数据引擎概述

InnoDB特点介绍及数据引擎对应文件

  • 支持事务,支持4个事务隔离级别

  • MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB

  • 读写阻塞与事务隔离级别相关

  • 能非常高效的缓存索引和数据

  • 表与主键以簇的方式存储

  • 支持分区、表空间,类似oracle数据库

  • 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

  • 对硬件资源要求还是比较高的场合

  • 行级锁定,但是全表扫描操作仍然会是表级锁定,如update table set a=1 where user like ‘%lic%’;

  • InnoDB 中不保存表的行数,如 select count() from table;(统计表中所有字段的行数) 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表

  • 对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引

  • 清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表

在这里插入图片描述

InnoDB适用生产场景分析

  • 业务需要事务的支持

  • 行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成

  • 业务数据更新较为频繁的场景

    • 如:论坛,微博等
  • 业务数据一致性要求较高

    • 如:银行业务
  • 硬件设备内存较大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力

企业选择存储引擎的依据

  • 需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景

  • 支持的字段和数据类型

    • 所有引擎都支持通用的数据类型
    • 但不是所有的引擎都支持其它的字段类型,如二进制对象
  • 锁定类型:不同的存储引擎支持不同级别的锁定

    • 表锁定: MyISAM 支持
    • 行锁定: InnoDB支持

如何配置存储引擎

查看系统支持的存储引擎

show engines;
#查看当前支持存储引擎

show create table <表名>\G;
#可以通过查看表结构中包含的存储引擎的信息

show table status from <库名> where name='<表名>'\G;
#可以通过查看库中某个表的状态,其中也包含了所使用的存储引擎

在这里插入图片描述

查看表使用的存储引擎

alter table <表名> engine=MyISAM;
#指定表修改存储引擎为MyISAM

在这里插入图片描述

#命令行进行操作修改配置文件
vim /etc/my.cnf
[mysqld]
default-storage-engine=MyISAM
#更改表的默认存储引擎为MyISAM

systemctl restart mysqld.service
#此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会受影响。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

补充

表锁与行锁

  • 表锁会导致表中数据的读写相互阻塞
  • 行锁如果使用不当会导致死锁(死锁一般是事务相互等待对方释放资源,最后形成环路导致死锁)

InnoDB使用表级锁定的场景

  • 全表扫描的时候,比如where语句中使用like做模糊查询时会导致表级锁定
  • select count(*)统计全表的记录行数的时候
  • 使没有索引的字段操作的时候InnoDB行锁使通过给索引项实现的,如果没有索引那就会全表扫描

行锁的示例

示例条件:创建一张新表数据,设置存储引擎为InnoDB,创建一个独列索引(id),两个终端同时开启事务进行操作:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

表锁的示例

在这里插入图片描述
在这里插入图片描述

死锁的示例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何避免死锁?

  • 使用更合理的业务逻辑,以固定的顺序访问表和行数据
  • 大事务拆小,大事务更容易出现死锁,如果业务允许,将大事务拆成多个小事务执行
  • 在同一个事务中,尽可能做一次锁定所需的所有资源,减少死锁概率
  • 降低隔离级别。如果业务允许,可以降低隔离级别,比如把RR调整成RC,这样可以避免很多造成死锁的因素
  • 为表字段添加合理的索引。因为不使用会进行表级锁定,死锁的概率就会提高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c<8>指针

目录 2&#xff0c;指针的赋值 2.1C语言允许指针赋值为0&#xff08;初始化&#xff09; 2.2指针赋值例 2.3输出指针的值 3&#xff0c;用指针引用数组 3.1利用指针输入数组 3.2优先级问题 4.多维数组 5.字符串 5.1通过指针引用字符串 4.函数中对指针的应用 4.1将指针变…

[附源码]计算机毕业设计车源后台管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Acer W700废物利用- 第一章 - 安装Linux系统Debian 11.5

前言 收拾房子时在犄角旮旯发现了一台N年前的Windows平板&#xff0c;也就是今天的主角&#xff1a;Acer W700 &#xff0c;机器配置是&#xff1a;CPU&#xff1a;I5-3337U&#xff1b;内存&#xff1a;4G&#xff1b;硬盘&#xff1a;128G固态&#xff1b; 插上充电线&…

YOLOv5图像分割--SegmentationModel类代码详解

目录 ​编辑 SegmentationModel类 DetectionModel类 推理阶段 DetectionModel--forward() BaseModel--forward() Segment类 Detect--forward SegmentationModel类 定义model将会调用models/yolo.py中的类SegmentationModel。该类是继承父类--DetectionModel类。 cl…

数学基础从高一开始1、集合的概念

数学基础从高一开始1、集合的概念 目录 数学基础从高一开始1、集合的概念 一、课程引入 解析&#xff1a;方程​编辑2是否有解&#xff1f; 解析&#xff1a;所有到定点的距离等于定长的点组成何种图形&#xff1f; 结论&#xff1a; 二、课程讲解 问题1&#xff1a; 集…

1548_AURIX_TC275_锁步比较逻辑LCL

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这可能是这段时间看过的最简单的一个章节了&#xff0c;所有的章节内容都可以放进这一份笔记也不显得多。 1. 首先明确LCL的意思&#xff0c;其实是锁步核比较器逻辑的意思&#xff0c;还不…

知识点1--认识Docker

IT界2014年之前&#xff0c;对于服务器虚拟化的使用&#xff0c;有过一个流派&#xff0c;基于Windows server系统VMware组成服务器集群&#xff0c;但是后期由于这样的使用方式维护成本相当高&#xff0c;比如服务器的序列、服务器台账以及服务器与服务器之间的切换等等&#…

据说Linuxer都难忘的25个画面

虽然对 Linux 正式生日是哪天还有些争论&#xff0c;甚至 Linus Torvalds 认为在 1991 那一年有四个日子都可以算作 Linux 的生日。但是不管怎么说&#xff0c;Linux 已经 25 岁了&#xff0c;这里我们为您展示一下这 25 年来发生过的 25 件重大里程碑事件。 1991&#xff1a;L…

SpringMVC学习笔记二(获取Cookies、Session和Header、IDEA热部署)

目录 一、一些前置知识 二、SpringMVC获取cookies和session &#x1f351;获取cookies和header &#x1f351;获取session 三、SpringMVC热部署 &#x1f4dd;添加框架支持 &#x1f4dd;settings配置开启自动热部署 &#x1f4dd;开启运行中热部署&#xff1a; &…

【Autopsy数字取证篇】Autopsy案例创建与镜像分析详细教程

【Autopsy数字取证篇】Autopsy案例创建与镜像分析详细教程 Autopsy是一款非常优秀且功能强大的免费开源数字取证分析工具。—【蘇小沐】 文章目录【Autopsy数字取证篇】Autopsy案例创建与镜像分析详细教程1.实验环境2.Autopsy下载安装&#xff08;一&#xff09;创建案例1.软件…

【简单易操作】图漾TM460-E2深度网络相机在ROS-melodic环境下的配置过程

目录一、配置的环境二、下载内容及链接三、ubuntu环境配置下载 Camport3 SDK安装依赖编译运行四、安装OpenNI2套件下载 Camport3 OpenNI2 SDK安装 Camport3 OpenNI2 SDK五、ROS平台安装下载 Camport3 ROS SDK编译配置环境变量运行一、配置的环境 相机型号&#xff1a;TM460-E2…

OpenRASP agent源码分析

目录 前言 准备 源码分析 1. manifest 2. agent分析 3. agent卸载逻辑 总结 前言 笔者在很早前写了(231条消息) OpenRASP Java应用自我保护使用_fenglllle的博客-CSDN博客 实际上很多商业版的rasp工具都是基于OpenRASP的灵感来的&#xff0c;主要就是对核心的Java类通过…

堆(二叉堆)-优先队列-数据结构和算法(Java)

文章目录1 概述1.1 定义1.2 二叉堆表示法2 API3 堆相关算法3.1 上浮&#xff08;由下至上的堆有序化&#xff09;3.2 下沉&#xff08;由上至下的堆有序化&#xff09;3.3 插入元素3.4 删除最大元素4 实现5 性能和分析5.1 调整数组的大小5.2 元素的不可变性6 简单测试6 后记1 概…

2006-2020年全国31省人口老龄化水平

2006-2020年全国31省人口老龄化 1、时间为2006-2020年 2、来源&#xff1a;人口与就业年鉴 3、数据缺失情况说明&#xff1a; 其中2010年存在缺失&#xff0c;采用线性插值法进行填补&#xff0c;内含原始数据、线性插值 4、计算说明&#xff1a;以城镇地区老年抚养比衡量…

uImage的制作过程详解

1、uImage镜像介绍 参考博客&#xff1a;《vmlinuz/vmlinux、Image、zImage与uImage的区别》&#xff1b; 2、uImage镜像的制作 2.1、mkimage工具介绍 参考博客&#xff1a;《uImage的制作工具mkimage详解(源码编译、使用方法、添加的头解析、uImage的制作)》&#xff1b; 2.2…

软路由搭建:工控机(3865U)安装esxi并在esxi上创建iStoreOS做主路由(网卡直通)

一、硬件介绍 1、工控机&#xff08;3865U&#xff09; CPU&#xff1a;3865U 内存&#xff1a;8G 硬盘&#xff1a;120G 网卡&#xff1a;六口网卡 2、无线路由器&#xff08;荣耀路由器pro2&#xff09; 3、主机 下载资料、制作启动盘、系统设置 4、U盘 至少8G以上 …

ConcurrentHashMap 1.7与1.8的区别

ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于&#xff1a;put和 get 两次Hash到达指定的HashEntry&#xff0c;第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表 从1.7到1.8版本&#xff0c;由于HashEntry从链表 变成了红黑树所以 concurr…

Python Gui之tkinter(下)

6.Radiobutton单按按钮 Radiobutton控件用于选择同一组单选按钮中的一个。Radiobutton可以显示文本&#xff0c;也可以显示图像。 7.Checkbutton复选按钮 Checkbutton控件用于选择多个按钮的情况。Checkbutton可以显示文本&#xff0c;也可以显示图像。 经典的Gui类的写法&a…

关于liunx 宝塔运行php项目

文章目录前言一、申请liunx服务器安装宝塔环境二、安装php看你自己安装需要的版本三.php文件创建四.数据库创建五.访问项目就可以了前言 自己研究学习&#xff0c;大佬勿喷 一、申请liunx服务器安装宝塔环境 我是线上安装的都一样看个人习惯爱好吧 等待安装完成提示地址和账…

Java基础—重新抛出异常

重新抛出异常 在catch块内处理完后&#xff0c;可以重新抛出异常&#xff0c;异常可以是原来的&#xff0c;也可以是新建的&#xff0c;如下所示&#xff1a; try{ //可能触发异常的代码 }catch(NumberFormatException e){ System.out.println("not valid numbe…