mysql 散记:innodb引擎和memory引擎对比 sql语句少用函数 事务与长事务

innodb引擎和memory引擎对比

innodb引擎是索引组织表(B+树),memory引擎是堆组织表(数组)

memory引擎数据结构

在这里插入图片描述
图片来自极客时间 丁奇 MySQL实战45讲

对比

  • 内存表按照写入顺序 顺序存放,innodb表数据有序存放
  • 内存表重启mysql就没了,innodb重启了还在
  • 内存表锁粒度粗,表锁;innodb有行锁
  • 写入数据:内存表里有空位就可以随便放数据,innodb表要保证树的有序性,要在指定位置插入数据
  • 数据位置变化时,内存表所有索引都要改(因为每个索引都直接指向数据的物理位置),innodb只用改主键索引(二级索引存的是主键索引位置,不用改)
  • 内存表所有索引地位相同,arr[index]取数据;innodb表二级索引地位低于主键索引
  • 内存表每个元素类型相同,都是arr item的统一类型;innodb表每个字段类型可以不同

sql 语句:尽可能不使用函数条件

使用函数条件会导致索引优化不能用,引起全表扫描。因为函数字段破坏索引的有序性。比如:

select  id, name from t where id+1 > 200 (where部分是函数表达式,no no no)
select count(*) from t where month(time)=7; 

隐式转换

隐式类型转换

隐式类型转换也相当于函数处理,会导致索引无效,比如:

select * from tradelog where tradeid=110717; // tradeid是varchar类型
// 这个操作就相当于在做数值比较,tradeid会先转成int类型再和110717比较 等价  CAST(tradid AS signed int) = 110717;
// 这个语句会走全表扫描
隐式字符编码转换

隐式字符编码转换,比如:t1的字符集是utf8mb4,t2的字符集是utf8;utf8mb4是utf8的超集。两个表字段进行比较时,utf8会先调用函数转utf8mb4再比较

如果调用时函数作用在参数上就不影响索引选择,但函数作用在列上,就会导致索引失效

// 索引失效
select t2.* from t1, t2 where t1.aid=t2.aid and t1.id=2; 
// 步骤:在t1表上拿到t1.id这行aid(utf8mb4);到t2表上找到t2.aid=utf8mb4 aid对应的行,转换字符集 => 找CONVERT(t2.aid USING utf8mb4) = $(t1.aid).value(参数常量)
// 函数作用在索引字段上,索引失效// 不影响索引
select t1.c from t1, t2 where t1.aid=t2.aid and t2.id=4;
// 步骤:在t2表上拿到t2.id这行的aid(utf8);到t1表上找t1.aid=utf8 aid对应的行,转换字符集 => 找t1.aid=CONVERT($(t2.aid).value USING utf8mb4) (参数常量)
补充问题
`b` varchar(10) DEFAULT NULLselect * from table_a where b='1234567890abcd';
// 不是直接找不到,而是扫描行 找 然后 对比,最后发现找不到。执行步骤:截断查找1234567890(10位),innodb找到了回到server层对比,不相等,循环 最后失败

事务与长事务

ACID

Aatomicity原子性事务中的所有操作统一成功,统一失败 // 部分失败就需要回滚 undolog
Cconsistency一致性
Iisolation隔离性mvcc一致性视图
Ddurability持久性永久保存,故障恢复(redo log)
  • 存储引擎执行语句时默认都会开启事务;只读操作不开启事务

  • 读(select … for update, select … lock in share mode)写操作默认开启事务

  • 默认set autocommit=1 // 自动提交;如果业务设置了set autocommit=0需要显示的commit才能提交事务

    • set autocommit=0容易导致意外的长事务
  • begin;时只是做了记录,到执行第一条读写语句时才真正开启事务,分发事务ID

    • 只读事务部分发事务ID,事务ID是为了处理写操作冲突问题
  • 马上启动事务语句:start transaction with consistence snapshot; // 创建一致性视图

    • 可重复读级别下才有一致性视图,读已提交下该语句等价start transaction;

read view

innodb中有两种视图:mvcc 一致性视图、view 虚拟表

MVCC 一致性视图
  • MVCC是为了解决事务ACID中的I isolation隔离性出现的
  • 历史数据不是直接存在的,而是通过undo log版本链在需要时计算出来的
    • undo log 实现秒级快照

go 原子操作、加锁、MVCC多版本并发控制_mvcc golang-CSDN博客

当前读
begin; // 假设创建可重复读级别的视图// Q1:在undo log上,拿着活跃列表走过不可见事务直至找到第一个可见事务,读这条数据
select * from t where id = 5; // 可重复读// Q2:更新数据前都要查一次数据,读是当前读:读最新的数据
update table t set c = 6 where id = 5; // 当前读// 自己的update对自己可见,所以此时读到的数据是Q2更新后的数据,与Q1时不同
select * from t where id = 5; commit;

select … for update(写锁)、select … lock in share mode(读锁)也是当前读。

view 虚拟表

查询语句定义的虚拟表,相当于持久化的查询语句别名。在调用时执行查询语句并生成结果。

虚拟表只存储查询定义,不存储实际数据。

长事务的影响与排查

影响
  • 长期占用连接,内存不释放,变大

    • 内存不是在使用完后释放,而是在连接断开或重置时释放
  • 长事务阻塞后续操作,

    • 可能导致线程用满 // 都等着执行,但长事务占着资源
    • 可能引起后续查询慢,比如长事务update id=1的数据10万次,没执行完成时select * from t where id = 5;需要在undo log链表上往前找10万多次才能找到需要返回的数据
  • 主从延迟 主库执行长事务10分钟,再发到从库去执行

    • 无法应用从库并行复制能力
  • 崩溃恢复时间长 可能因为 长事务回滚

排查方法

  • 是否set autocommit=0

    • 随便查个业务,通过general_log看是不是没有commit
  • information_schema.Innodb_trx 监控这个表,看长事务阈值

    select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60
    

预防

  • 业务执行设置超时时间

  • 长事务会导致undo log很大,innodb_undo_tablespaces = 2(2个独立的表空间文件), 方便回滚清理

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

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

相关文章

APK安装器(安卓端)一键解除VX限制!轻松安装各种手机应用

VX为了防止恶意软件通过平台传播,保障用户设备安全,会把通过VX发送的 APK 文件自动改成 “apk.1” 格式,这样就能减少恶意软件传播的风险。我平时推荐安卓软件的时候,有朋友反馈说,文件发到VX里就变成 “apk.1” 了&am…

Debian:从GNOME切换到Xfce

最近为20年前的T43重新安装了Debian系统,但使用的gnome桌面太卡了。于是换成轻量级的Xfce系统。 1.安装Xfce sudo apt update sudo apt install xfce4 xfce4-goodies命令中xfce4 是Xfce桌面环境的核心组件,xfce4-goodies 是一些额外的工具和插件&#xf…

徐州服务器租用:BGP线路的特点有哪些?

BGP的中文全称为边界网关协议,是指一种运行在传输控制协议上的自治系统路由协议,主要的功能就是可以实时控制路由的传播,同时能够帮助用户选择更合适的路由线路,保证网络能够稳定的运行,不会轻易出现网络卡顿或故障的状…

Java使用OSHI获取服务器信息

OSHI可以获取系统信息&#xff08;CPU、内存、磁盘、网络等&#xff09;&#xff0c;纯Java实现&#xff08;通过JNA访问本地API&#xff0c;无需安装本地库&#xff09;&#xff0c;跨平台支持。引入依赖<dependency><groupId>com.github.oshi</groupId><…

企业数字化资产管理安全、成本、协作困局难解?

在数字化浪潮席卷全球的今天&#xff0c;3D技术已成为驱动影视动画、工业设计、建筑可视化等领域创新的核心动力。然而&#xff0c;随着3D资产规模呈指数级增长&#xff0c;企业正面临前所未有的管理挑战&#xff1a;海量模型存储混乱、版本迭代难以追溯、团队协作效率低下、知…

力扣面试150题--组合总和

Day 72 题目描述&#xff08;终于理顺回溯了&#xff09;思路 这里还是基于模板来说明代码思路void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择 : 本层集合中的元素) {处理节点;backtracking(路径, 选择列表); // 递归撤销处理; // 回溯} }对于主要函数的…

多客户端-服务器(select,poll)

多客户端-服务器结构总结一、普通CS架构的局限性核心问题&#xff1a;单线程中accept&#xff08;阻塞等待连接&#xff09;与read&#xff08;阻塞读取数据&#xff09;函数互相干扰&#xff0c;无法同时处理多客户端。本质原因&#xff1a;阻塞型函数需独立执行&#xff0c;若…

如何使用postman做接口测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 常用的接口测试工具主要有以下几种&#xff1a;Postman: 简单方便的接口调试工具&#xff0c;便于分享和协作。具有接口调试&#xff0c;接口集管理&#xff0c…

新型网络架构设计助力智慧医疗降本增效

随着智慧医疗的快速发展,越来越多的医院开始布局“互联网+医疗”服务,通过数字化手段提升医疗服务效率。然而,如何构建一个既稳定可靠又具备灵活扩展能力的医疗网络,成为医院数字化转型中的关键问题。本文以某智慧医疗项目为例,探讨传统网络与SD-WAN结合的最佳实践。 背景…

一文读懂现代卷积神经网络—使用块的网络(VGG)

目录 什么是使用块的网络&#xff08;VGG&#xff09;&#xff1f; 一、VGG 的核心思想&#xff1a;用块&#xff08;Block&#xff09;构建网络 二、VGG 的网络结构 三、VGG 的优势 1. 结构简洁统一 2. 强大的特征表达能力 3. 小卷积核的计算效率 4. 良好的迁移学习性…

Linux的相关学习

linux 1.文件权限怎么修改 chmod [权限模式] [文件或目录]1、**数字模式&#xff08;八进制&#xff09;**&#xff1a; chmod 755 myfile.sh # 所有者&#xff1a;rwx (7)&#xff0c;组&#xff1a;r-x (5)&#xff0c;其他用户&#xff1a;r-x (5) 7 rwx&#xff08;读写…

Kotlin集合接口

Kotlin 集合概述 Kotlin 集合提供了对数据进行各种操作的便捷方式。它们实现了接口&#xff0c;因此可以操作不同类型的数据。例如&#xff0c;你可以编写一个函数&#xff0c;同时打印 Set 和 List 的所有元素。我们来看看这是如何实现的。Iterable 接口 我们已经知道&#xf…

Git 常用操作与注意事项全攻略

1. 基本配置 git config --global user.name "你的名字" git config --global user.email "你的邮箱" git config --list # 查看当前配置建议全局配置用户名和邮箱&#xff0c;否则提交记录可能不规范2.仓库操作 初始化本地仓库 git init只在新建项目时使…

STM32-第五节-TIM定时器-1(定时器中断)

一、定时器原理&#xff1a;1.介绍&#xff1a;对指定输入时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。分类&#xff1a;基本定时器&#xff0c;通用定时器&#xff0c;高级定时器频率&#xff1a;72MHZ2.框图&#xff1a; &#xff08;1&#xff09;基本定时器&…

【图像处理基石】什么是色盲仿真技术?

色盲仿真概述 色盲仿真是一种将正常色彩图像转换为色盲患者感知效果的技术。人类常见的色盲类型包括&#xff1a; 红色盲&#xff08;Protanopia&#xff09;&#xff1a;无法感知红色绿色盲&#xff08;Deuteranopia&#xff09;&#xff1a;无法感知绿色蓝黄色盲&#xff08;…

九、官方人格提示词汇总(中-3)

“参谋代写计划”功能输出欣赏&#xff0c;规则&#xff1a; 本部分统一使用 Gemini 2.5 Pro API。该 API 下的输出质量基本达到我的要求&#xff0c;已具备实用价值。严格等级均为“权衡有度&#xff08;L3&#xff09;”&#xff0c;创造力等级均为“趋势捕手&#xff08;L3…

华为MateBook D 16 SE版 2024款 12代酷睿版i5集显(MCLF-XX,MCLF-16)原厂OEM预装Win11系统

适用型号&#xff1a;MCLF-XX,MCLF-16链接&#xff1a;https://pan.baidu.com/s/1OkvUqZMdCSF98YtQfWAYXw?pwdq2gh 提取码&#xff1a;q2gh 华为开箱状态出厂Windows11系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、华为电脑…

Python自动化:每日销售数据可视化

这是手动执行sql分组查出的Linda奶茶店每日的销售数据,那么能否图形化展示方便对比近一个月每日的销售趋势呢。如果是做在网站里,前端可以集成echart或highchart生成柱状图或线状图。如果需要每天定时推送这些数据到邮箱或其他消息通知渠道,第一步肯定是需要先生成图片到服务…

scrapy项目开发流程

1.创建项目&#xff1a;scrapy startproject mySpider2.生成一个爬虫&#xff1a;scrapy genspider itcast itcast.cn3.提取数据&#xff1a;根据网站结构在spider中实现数据采集相关内容4.保存数据使用pipeline进行数据后续处理和保存1.创建项目items.py-->自己预计需要爬取…

堆排序以及其插入删除

堆排序首先介绍一下堆排序属于选择排序的一种类型。其次就是他有点依赖于顺序存储树判断其孩子以及父节点的概念&#xff0c;接下来复习一下。堆分为大根堆和小根堆① 若满⾜&#xff1a;L(i)≥L(2i)且L(i)≥L(2i1) &#xff08;1 ≤ i ≤n/2 &#xff09;—— ⼤根堆&#xff…