数据库-引擎

news2024/11/27 3:45:54

存储引擎:

mysql当中数据用各中不同的技术存储在文件中,每一种技术都使用的是不同的存储机制,索引技巧 索引水平,以及最终提供的不同功能和能力,这些就是我们说的引擎。

功能:

  1. mysql将数据存储在文件系统中的一种方式和格式
  2. 存储引擎负责执行实际的数据i/o操作(读写操作)
  3. 存储引擎介于数据和文件系统之间,数据会先保存到存储引擎,在按照存储引擎的格式保存到文件系统

Mysql存储引擎的分类:

  1. INNODB:5.5之后mysql的默认存储引擎,又叫做事务性速记引擎,支持ACID事务,支持行锁,锁表,写入和查询性能比较好
  2. MYISAM:5.5之间的默认存储引擎,插入数据的性能较高,查询速度也很优秀,但是不支持事务
  3. Memory:所有数据都保存在内存的存储引擎,插入数据,更新数据速度都比较快,但是占用内存空间比较大,会占用和数据成正比的内存空间,mysql一旦重启,数据就会丢失
  4. CSV:由逗号分隔数据的存储引擎,他会在数据库的子目录里为每个数据创建一个csv的文件,就是一种普通的文本文件,每个数据行都占用文本行,csv不支持索引
  5. Archive:非常适合大量的独立的,历史数据的引擎,不需要被经常读取,插入的速度很快,查询的效率比较低
  6. Blackhole:黑洞引擎,写入的任何数据都会消失

MYISAM和INNODB分析对比:

MYISAM:不支持事务,不支持外键,只支持全文索引,数据文件和索引文件是分开的,访问速度快

适合场景:查询和插入数据为主得到应用

在磁盘上有三个文件:

文件名和表名相同,但是扩展名不同:

.frm 存储的表结果

.MYD 数据文件

.MYI 索引文件

查看引擎:

配置文件修改引擎(这种方式只对新建的表有效)

修改存储引擎·:

方法1:

方法2:


通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务

方法3:

创表时创建

查看数据库内容:

MYISAM的特点:

  1. 表级锁定,更新数据时,整个都将锁定
  2. 数据库在读写过程中相互阻塞

MYISAM支持的存储格式:

  1. 静态表,固定长度表,静态表式MYISAM的默认存储格式,静态表中字段都是非可变字段,每一个记录都是固定长度,存储快,方便缓存,故障容易恢复,缺点是占用空间比较多
  2. 动态表,动态表可以支持包含可变字段,记录的长度是不固定的,优点是占用空间少,频繁更新数据,删除记录,会产生碎片,需要定期清理(命令:myisamchk -r),出现故障恢复比较困难
  3. 压缩表:myisamchk工具创建的,占据的空间非常小,每条记录都是单独压缩的

INNODB:

支持4个事务的隔离级别,5.5之后是mysql的默认存储引擎

读写阻塞和隔离级别相关。

支持高效的缓存索引以及缓存数据

表以主键以簇的方式存储btree

支持外键约束,5.5之后INNODB也可以支持全文索引

支持行锁定,也可以支持表锁定(全表扫描)

  1. 使用like模糊查询,会进行全表扫描,锁定整个表
  2. 对没有创建索引的字段进行增,删,改,也会进行全表扫描,锁定整个表
  3. 使用索引,进行增,删,改,则是行级锁定

INNODB的特点:

  1. 不保存表的行数,统计表的行数,会扫描一遍整个表来计算有多少行
  2. 自增长,INNODB中必须包含只有该字段的索引
  3. Delete清空表,一行一行删,速度比较 truncate(推荐使用)

适用场景:

  1. 业务需要事务的支持
  2. 论坛,微博,对数据一致性比较高的场景
  3. 访问量和并发量比较高的场景,INNODB支持缓存,减少后台服务器的压力

三个文件:

表名.frm(表结构文件)

表名.ibd(即是索引文件,又是索引文件)

db.opt:(表的属性文件)

创表时指定引擎:

INNODB行锁和索引的关系 以及表锁 排查锁 死锁

INNODB锁行:

如果是主键呢

如果说使用的ID字段是主键INNODB对主键使用聚簇索引,锁定整行的记录,其他行不受影响

解决方法,一边commit提交即可

INNODB锁表:

要对一个非索引键进行操作

如果其他行呢,也不能执行

只是写入被锁定,对查没有影响

解决方式,commit即可

锁表小结:当一个事务对非索引列进行操作,因为因为要 全表扫描过滤,所有整张比表都会被锁死,唯有可查

排他锁:

里面的事务一提交,外面的就结束了,可以继续操作

For update 排他锁

死锁:

事务之间相互等待对方资源,最后形成一个环路造成的

  1. 发生死锁时,数据库会自动选择一个事务作为受害者,然后先解除死锁,再进行回滚
  2. 一旦发生死锁,会选择一个事务作为死锁的牺牲品,直接终止其中一个事务,但是不会自动回滚

总结:

索引,锁行

非索引,锁表

排他锁,一个事务在操作,另一个事务无法执行,只能查,排他锁只能加一个,排他锁也叫悲观锁,乐观锁(补充)不会有任何提示,只是数据不能写入,数据提交更新时,进行校验,发生冲突,数据不生效而已,没有其他的报错或者卡顿

死锁,会自动选择一个事务作为牺牲品,结束死锁

演示要求:

  1. 存储引擎只能时INNODB
  2. Mysql默认隔离级别即可

如何尽可能的避免死锁:

  1. 业务的逻辑必须要合理,以固定的顺序访问表和行
  2. 如果事务的类型比较复杂,要进行拆分,在业务允许的情况下,把大的事务拆小,分次执行
  3. 在同一事务中,尽可能的一次性锁定所有需要的资源,可以减少死锁的概率
  4. 隔离级别,read commit。可以避免死锁
  5. 添加合理的索引,可以减少死锁的概率

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

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

相关文章

vscode设置保存后,自动格式化代码

第一步:打开setting.json文件 第二步:在setting.json中加入以下代码 "editor.formatOnType": true, "editor.formatOnSave": true, "editor.formatOnPaste": true

文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题

二、用go语言,位向量(bit vector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为 O(1)。 文心一言,代码正常运行&#x…

企业级人像背景分割解决方案

人工智能和机器学习已经在各个行业领域展现出了巨大的潜力。其中,人像背景分割技术作为一项具有广泛应用价值的解决方案,正在受到越来越多企业的关注。美摄科技,作为一家专注于图像和视频处理的人工智能公司,以其卓越的技术实力和…

携手海外网红营销:出海品牌2023黑色星期五的制胜法宝

作为一年一度的购物狂欢节,2023年黑色星期五即将到来。随着全球化的加速,越来越多的品牌开始将目光投向海外市场,寻求在这个特殊的时刻实现销售的飙升。其中,海外网红已经成为数字营销的中坚力量,能够为品牌带来广泛的…

Linux离线安装MySQL8报缺少perl包问题

前言:Linux在线安装MySQL是比较简单的,这里主要介绍离线安装 linux版本为CentOS7,具体为:CentOS-7-x86_64-DVD-2009.iso mysql版本为8,具体为:mysql-8.2.0-1.el7.x86_64.rpm-bundle.tar 准备工作 安装之前…

Excel根据给定值,锁定所在行

使用方法 使用函数:MATCH(给定的值,查找的列) 适用示例 在表格中查询“2023/1/15”所在的行: 最终结果:

windows mysql安装

1、首先去官网下载mysql安装包,官网地址:MySQL :: Download MySQL Community Server 2:把安装包放到你安装mysql的地方,然后进行解压缩,注意,解压后的mysql没有配置文件,我们需要创建配置文件 配…

上传LaTeX版本的NeurIPS文章到arXiv总是Failed的解决方案

往arXiv上传NeurIPS模版文章时,一直出现两处报错,一处是下图中的图片错误: 但是,我怀疑是不是图片并排放置的minipage不可用,于是改成了正常的图片形式来测试: 仍然是相同的错误,于是我又尝试去…

一个使用uniapp+vue3+ts+pinia+uview-plus开发小程序的基础模板

uniappuviewPlusvue3tspiniavite 开发基础模板 使用 uniapp vue3 ts pinia vite 开发基础模板,拿来即可使用,不要删除 yarn.lock 文件,否则会启动报错,这个可能和 pinia 的版本有关,所以不要随意修改。 拉取代码…

Redis中String类型的命令

目录 Redis中的内部编码 redis的数据结构和内部编码 Redis中的String类型 String类型的常见命令 set get mget mset String类型的计数命令 incr incrby decr incrbyfloat 其他命令 append getrange setrange strlen String类型的内部编码 Redis中的内部编码…

并发编程 - PriorityQueue用法

一、PriorityQueue介绍 队列是遵循先进先出(First-In-First-Out)模式的,PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部分。 优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器&#x…

LLM之Prompt(一):5个Prompt高效方法在文心一言3.5的测试对比

在Effective Prompt: 编写高质量Prompt的14个有效方法文中我们了解了14个编写Prompt的方法(非常感谢原作者),那么这些Prompt在具体大模型中的效果如何呢?本文以百度文心一言3.5版本大模型在其中5个方法上做个测试对比。 第1条&am…

MySQL---搜索引擎

MySQL的存储引擎是什么 MySQL当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧 锁定水平,以及最终提供的不同的功能和能力,这些就是我们说的存储引擎。 MySQL存储引擎的功能 1.MySQL将数据存储在文…

Python蓝桥杯的一些数据输入输出格式

近期,准备Python组蓝桥杯比赛,对于数据的输入输出还是不熟悉,今天整理如下方便日后使用: 输入 对于这种一个表示个数一个表示长度的例子 n,m map(int,input().split())第一行是个数,下面是对应的条数 n,m map(int,i…

基于若依的ruoyi-nbcio流程管理系统增加仿钉钉流程设计(七)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 这一节主要讲增加延时节点的一些功能 1、首先配置文件增加延时配置 delay: {type: "delay",c…

【C++代码】编辑距离,最长递增子序列,最长连续递增序列,最长重复子数组,最长公共子序列,不相交的线,动态规划--代码随想录

题目:最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,…

设数据为01101001,试采用4个校验位求其偶校验方式的海明码。

遇到一个题目,但是教材书上写的比较迷糊,看不懂,后来在网上搜了一下方法,发现还是比较简单的,现在分享一下我的解法 首先,套用公式:2k - 1 > n k 因为求得数字是8位数,n8&#x…

代码冲突解决

远程仓库修改 本地代码修改 接下来我们push一下 如果使用IDE 冲突内容如下: 我们可以使用自带的工具进行修改 我们选择接受自己改动的即可 如果使用git工具怎么去处理呢 远程分支是这样 本地是这样的 add和commit之后,再pull,最后pus…

el-form-item添加校验规则后取消前面的星号

0 效果 联系电话添加了rules校验,但前面的星号不需要 1 样式

AdvFaces: Adversarial Face Synthesis

AdvFaces: Adversarial Face Synthesis AdvFaces:对抗性人脸合成 摘要 我们提出了AdvFaces,一种自动对抗人脸合成方法,通过生成对抗网络学习在显著面部区域产生最小的扰动。一旦AdvFaces经过训练,它就可以自动产生难以察觉的扰动&#xff0…