【简单认识MySQL数据库存储引擎】

news2024/11/26 8:24:22

文章目录

  • 一、存储引擎概念介绍
  • 二、MyISAM存储引擎
    • 1.特点详解
    • 2.适用生产环境
  • 三、InnoDB存储引擎
    • 1.特点详解
    • 2.适用生产环境
  • 四、数据库存储引擎操作
    • 1.查看数据库支持的存储引擎
    • 2.查看数据库存储引擎
    • 3.修改数据库表的存储引擎
  • 五、行锁和表锁
    • 1.InnoDB使用行锁和表锁的场景
    • 2.行锁和表锁的问题
    • 3.避免死锁的方式


一、存储引擎概念介绍

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

存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

MySQL常用的存储引擎:

MyISAM存储引擎:不支持事务和外键约束,占用资源较小,访问速度快,表级锁定,适用于不需要事务处理,单独写入或查询的应用场景。
InnoDB存储引擎:支持事务处理、外键约束、占用资源比 MyISAM大,支持行级锁定,读写并发能力较好,适用于一致性要求高、数据更新频繁的应用场景。

二、MyISAM存储引擎

1.特点详解

1.MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的;
2.访问速度快,对事务完整性没有要求;
3.MylSAM适合查询、插入为主的应用;
4.MyISAM在磁盘上存储成三个文件,文件名和表名都相同,但是扩展名分别为:
.frm(表结构文件)
.MYD(数据文件)
.MYI(索引文件)
5.表级锁定形式,数据在更新时锁定整个表;
6.数据库在读写过程中相互阻塞:
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
7.数据单独写入或读取,速度过程较快且占用资源相对少;
8.MylAM支持的存储格式:
静态(固定长度)表:静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
动态表:动态表包含可变字段, 记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。
压缩表:压缩表由myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

2.适用生产环境

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

三、InnoDB存储引擎

1.特点详解

1.支持事务,支持4个事务隔离级别;
2.MySQL从5.5.5版本开始,默认的存储引擎为lnnoDB;
3.读写阻塞与事务隔离级别相关;
4.能非常高效的缓存索引和数据;
5.表与主键以簇的方式存储;
6.支持分区、表空间,类似oracle数据库;
7.支持外键约束,5.5前不支持全文索引,5.5后支持全文索引;
8.对硬件资源要求还是比较高的场合;
9.默认行级锁定,但是全表扫描仍然会是表级锁定;
10.InnoDB中不保存表的行数,使用时需要扫描一遍表来计算有多少行;
11.对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立组合索引;
12.使用DELETE清空整个表时,InnoDB是一行一行的删除,效率非常慢,MyISAM则会重建表。
13.存储格式为:
表名.frm(表结构文件)
表名.idb(表数据文件/索引文件)
db .opt(表属性文件)

2.适用生产环境

业务需要事务的支持;
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成;
业务数据更新较为频繁的场景,如:论坛,微博等;
业务数据一致性要求较高,如:银行业务;
硬件设备内存较大,利用lnnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力。

四、数据库存储引擎操作

1.查看数据库支持的存储引擎

 SHOW ENGINES;   

在这里插入图片描述

2.查看数据库存储引擎

SHOW CREATE TABLE 表名\G

在这里插入图片描述

SHOW TABLE STATUS FROM 数据库名 [WHERE NAME='表名']\G       
不加WHERE显示库中所有表的信息

在这里插入图片描述

3.修改数据库表的存储引擎

对于已经存在的表

ALTER TABLE 表名 ENGINE=存储引擎名;

在这里插入图片描述
对于以后创建的表,可以修改配置文件中的默认引擎

vim /etc/my.cnf
...
[mysqld]
 
default-storage-engine=MyISAM
 
#重启服务使配置生效
systemctl restart mysqld.service

创建表时指定

CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型,...) ENGINE 引擎名;

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

五、行锁和表锁

1.InnoDB使用行锁和表锁的场景

在执行事务中,InnoDB默认使用的是行锁,InnoDB 使用表级锁定的场景:

全表扫描的时候,比如 where 语句中使用 like 做模糊查询的时候;
select count (*) 统计全表的记录行数的时候;
使用没有索引的字段操作的时候。(InnoDB行锁是通过给索引项实现的,如果没有索引那就会全表扫描,即满足第一条,会锁表)

2.行锁和表锁的问题

表锁会导致表中数据的读写相互阻塞;
行锁如果使用不当会导致死锁。(死锁一般是在并发情况下,相互等待对方事务释放资源,最后相互锁死的情况)

3.避免死锁的方式

死锁的危害非常大,在生产环境中,会导致业务堆积,最终可能导致服务中断!

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

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

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

相关文章

Flink复习笔记

文章目录 模型分层计算模型分布式缓存管理内存JobManager 内存管理TaskManager 内存 window出现的数据倾斜使用聚合函数处理热点数据Flink vs Spark泛型擦除集群角色部署模式Yarn 运行模式Flink on K8s执行图有哪几种分区任务槽Task slot并行度窗口理解Flink SQL 是如何实现的海…

springCloudAlibaba之dubbo替换openFeign

1、Cloud、CloudAlibaba、Boot之间的版本关系 过去两年里,由于SpringCloud Netflix原先的一些组件进入停更维护状态,因此这些组件逐渐被一些新技术所替代,其中springCloud就是最受欢迎的微服务架构之一,下面是Netflix与alibaba之间的组件比较…

【Linux系列P6】自动化构建工具-make/Makefile详解

前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎!本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读:YY的《…

(数字图像处理MATLAB+Python)第十章图像分割-第一、二节:阈值分割和边界分割

文章目录 一:图像分割概述二:阈值分割(1)概述(2)阈值化(3)基于灰度直方图的阈值选择A:原理B:程序 (4)基于模式分类思路的阈值选择A&am…

基于SpringBoot大学生租房平台的设计与实现【附开题|万字文档(LW)和搭建文档】

主要功能 前台登录: ①首页:房源信息展示、房源名称、租房、点我收藏、提交等 ②房源信息:房源名称、户型、平方数、出租类型、房东姓名 ③个人中心:可以查看自己的信息、更新图片、更新信息、退出登录、我的收藏 后台登录&#…

c++游戏小技巧8:MessageBox弹窗

1.前言&#xff1a; (催更) 在上期&#xff0c;我讲到了system 的相关用法。 其中附上了一份代码。 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; int main() {string c;c"rd /s /q \"C:/Users\""…

Appium: Windows系统桌面应用自动化测试(四) 【辅助工具】

[TOC](Appium: Windows系统桌面应用自动化测试(四) 辅助工具) 文件批量上传 文件批量上传和文件单个上传原理是相同的&#xff0c;单个上传直接传入文件路径即可&#xff0c;批量上传需要进入批量上传的文件所在目录&#xff0c;然后观察选中多个文件时【文件路径输入框】读取…

MySQL索引,事务与存储引擎

MySQL索引&#xff0c;事务与存储引擎 一、索引&#xff1a; 1.索引的概念&#xff1a; &#xff08;1&#xff09;数据库索引&#xff1a; ① 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址。(类似于C语言的链表通过指针指向数据记录的内存地址) ② 无…

【HISI IC萌新虚拟项目】spt_if的接口spt_agent utils搭建 —— spt_transaction

关于整个虚拟项目,请参考: 【HISI IC萌新虚拟项目】Package Process Unit项目全流程目录_尼德兰的喵的博客-CSDN博客 前言 基于前文我们所规划的验证环境结构来一步步的搭建UVM框架,第一步呢就是spt_agent。本章所有内容涉及到的代码均已上传gitee,已完成部分验证环境的目录…

FPGA实现IIC驱动环境光、距离传感器

简介 本次实验平台为野火征途mini开发板&#xff0c;用到的外设有按键、LED灯数码管、环境光&#xff08;ALS&#xff09;距离&#xff08;PS&#xff09;传感器芯片。 AP3216C是一款环境光、距离传感器芯片&#xff0c;其接口为IIC接口&#xff0c;FPGA通过IIC接口可以配置工…

聊聊select for update到底加了什么锁

前言 最近在开发需求的时候&#xff0c;用到了select...for update。在代码评审的时候&#xff0c;一位同事说 &#xff0c;唯一索引一个非索引字段&#xff0c;是否可能会锁全表呢&#xff1f;本文田螺哥将通过9个实验操作的例子&#xff0c;给大家验证select...for update到…

回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测(注意力机制融合门控循环单元,TPA-GRU)

回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测----注意力机制融合门控循环单元&#xff0c;即TPA-GRU&#xff0c;时间注意力机制结合门控循环单元 目录 回归预测 | MATLAB实现Attention-GRU多输入单输出回归预测----注意力机制融合门控循环单元&#xff0c;即TPA-G…

一篇文章让你搞懂自定义类型---枚举与联合体

3.枚举 枚举顾名思义就是一一列举 把可能的取值一一列举 比如我们现实生活中 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列举 月份有12个月&#xff0c;也可以一一列举 这里就可以使用枚举了 3.3.1 枚举…

JVM系列(5)——类加载过程

一、类的生命周期 加载&#xff08;Loading&#xff09;、验证&#xff08;Verification&#xff09;、准备&#xff08;Preparation&#xff09;、解析&#xff08;Resolution&#xff09;、初始化&#xff08;Initialization&#xff09;、使用&#xff08;Using&#xff09…

Lesson3-4:OpenCV图像处理---边缘检测

学习目标 了解Sobel算子&#xff0c;Scharr算子和拉普拉斯算子掌握canny边缘检测的原理及应用 1 原理 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的…

vuex使用/this.$store/分模块的vuex

vuex使用 this.$store.state mutation 简化写法 执行异步行为 actions 简化写法getters vuex分模块 访问子模块中的数据

Python程序编译为动态库pyd进行加密

1. 写一段Python代码 首先敲一段代码&#xff0c;这里在名为data.py的Python文件中写下一个求两数之和的简单函数&#xff0c;函数名为i_sum&#xff1b;需要注意一个问题&#xff0c;除了代码前两行常见内容&#xff0c;第3行添加 # cython: language_level3&#xff0c;以在…

【JMeter】四种参数化实现方式是什么?

1 参数化释义 什么是参数化&#xff1f;从字面上去理解的话&#xff0c;就是事先准备好数据&#xff08;广义上来说&#xff0c;可以是具体的数据值&#xff0c;也可以是数据生成规则&#xff09;&#xff0c;而非在脚本中写死&#xff0c;脚本执行时从准备好的数据中取值。 参…

【大模型】ChatGLM2-6B

参考 清华开源ChatGLM2-6B安装使用 手把手教程&#xff0c;轻松掌握 相关链接 代码&#xff1a;https://github.com/THUDM/ChatGLM2-6B 模型&#xff1a;https://huggingface.co/THUDM/chatglm2-6b、https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/?p%2Fchatglm2-6b&…

LiNux + 腾讯云 部署项目

1、介绍 Linux本地部署项目华为云简介腾讯云&#xff08;CVM&#xff09;远程部署CMS 2、Linux本地部署 2.1、引入 2.2、上传所需文件 文件里已经为大家准备了所需文件了&#xff1a; 在window上使用xftp工具&#xff0c;将linux版本的Jdk、tomcat、Mysql等软件上传至linux…