MySQL全局锁、表级锁、行锁、死锁、索引选择
文章目录
- 全局锁
- 表级锁
- 表锁
- 元数据锁 MDL
- 如何安全的给小表添加字段
- 1. 理解和监控长事务
- 2. 使用NOWAIT和WAIT语法
- 示例
- 3. 选择合适的时间窗口
- 4. 分阶段执行
- 5. 使用在线DDL工具
- 行锁
- 死锁
- 普通索引和唯一索引的选择
- 索引基础
- 业务场景分析
- 性能考量
- 实践建议
- 索引及其选择机制
- 索引选择错误的示例
- 问题出现的条件
- 优化器逻辑与决策因素
- 索引的区分度和基数
- 统计信息的角色
- 解决方案和实践建议
- 结论
本文为MySQL45讲 6-10的总结
根据加锁的范围可以分为全局锁、表级锁、行锁
全局锁
定义:对整个数据库实例加锁,让整个库处于只读状态
命令:Flush tables with read lock (FTWRL)
使用场景:做全库逻辑备份
不建议使用set global readonly=true
的原因:
- 在有些系统中readonly会被用为其他逻辑
- 在异常处理机制上面有差异,FTWRL若客户端异常导致断开,MySQL会自动释放,但是如果用此方法,状态不会改变
存在的问题:当全局备份时,相关业务都会停摆, 但是不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。如果开启事务,那么可重复读级别下是可以拿到一致性试图
官方自带的逻辑备份工具是mysqldump。当mysqldump使用参数–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是可以正常更新的。
表级锁
MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
表锁
语法: lock tables … read/write
特点:可以用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象;是最常用的处理并发的方式
元数据锁 MDL
特点:不需要显示使用,在访问表时会自动加上
作用:保证读写的正确性
在MySQL 5.5版本中引入了MDL,当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁。
-
读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。
-
读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。
-
事务中的MDL锁,在语句执行开始时申请,等到整个事务提交后再释放。
如何安全的给小表添加字段
1. 理解和监控长事务
在进行任何DDL操作前,我们需要监控并处理可能存在的长事务。长事务会持有元数据锁(MDL),这会阻止DDL操作的执行。您可以通过以下SQL查询来检查长事务:
SELECT * FROM information_schema.innodb_trx WHERE TIME_TO_SEC(timediff(now(), trx_started)) > N;
这里的N
是你定义的长事务的阈值(例如,60秒)。
2. 使用NOWAIT和WAIT语法
MySQL原生并不支持NOWAIT
和WAIT
语法。这是MariaDB一个特有的功能,继承自AliSQL。这些选项允许你控制DDL操作的等待行为:
NOWAIT
:尝试立即获取锁,如果无法立即获得则操作失败。WAIT N
:等待指定的秒数以获取锁,如果指定时间内无法获取锁,操作也会失败。
示例
如果你正在使用MariaDB,可以这样使用:
ALTER TABLE tbl_name NOWAIT ADD COLUMN new_column INT;
或者:
ALTER TABLE tbl_name WAIT 10 ADD COLUMN new_column INT;
3. 选择合适的时间窗口
尽管NOWAIT
和WAIT
提供了更多的灵活性,选择执行DDL操作的时间仍然至关重要。选择低峰时段进行操作可以显著减少对业务的影响。
4. 分阶段执行
对于非常大或非常活跃的表,考虑分阶段进行字段添加:
- 第一阶段:添加字段,但暂不使用新字段。
- 第二阶段:逐步在应用中实施使用新字段的代码。
- 第三阶段:在确认新字段稳定运行后,清理或迁移旧数据。
5. 使用在线DDL工具
对于MySQL用户,可以考虑使用诸如pt-online-schema-change
这类工具,它可以在不锁表的情况下进行表结构的变更。这对于需要24/7运行的应用尤为重要。
行锁
MySQL的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。InnoDB是支持行锁的,这也是MyISAM被InnoDB替代的重要原因之一。
特点: 在InnoDB事务中,行锁是在需要的时候才加上的,要等到事务结束时才释放。这个就是两阶段锁协议
使用:将最经常修改的数据放到最后提交,能最大程度减少锁等待
死锁
定义:并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态
解决方法
- 直接进入等待,直到超时,相关参数为:
innodb\_lock\_wait\_timeout
默认值为50s - 正常情况下采用:发起死锁检测,主动回滚某一个事务,相关参数:
innodb\_deadlock\_detect
默认值为on
在秒杀情况下,可以采取如下方法
- 临时关闭死锁检测,但是带有风险性
- 控制并发度,使用中间件,或者直接修改源码
- 将一条记录分为多条,但需要注意临界值处理
普通索引和唯一索引的选择
索引基础
在数据库设计中,普通索引和唯一索引是两种常见的索引类型,它们在应用时会根据业务需求和数据的特性来选择。普通索引允许索引列包含重复的值,而唯一索引则保证索引列的值全局唯一。
业务场景分析
例如,一个市民系统中,每个人的身份证号都是唯一的。如果系统需要通过身份证号查询个人信息,可以在id_card
字段上建立索引。这里存在两个选择:
- 普通索引:如果业务层已经保证了身份证号的唯一性,普通索引可以有效支持查找操作。
- 唯一索引:额外保证数据的唯一性,防止由于错误或漏洞导致重复数据的插入。
性能考量
- 查询性能:唯一索引和普通索引在查找数据时的性能差异微乎其微,因为InnoDB存储引擎的数据管理是基于数据页的,即使是普通索引在达到查询条件后的额外检索操作,也仅涉及内存中的简单计算。
- 更新性能:普通索引可以使用change buffer优化更新操作,尤其是当数据页不在内存中时。唯一索引需要检查唯一性约束,因此不能使用change buffer,可能导致更频繁的磁盘I/O。
实践建议
在选择普通索引还是唯一索引时,应该根据以下几点考虑:
- 数据唯一性需求:如果业务规则或逻辑已经确保了数据的唯一性,普通索引可能足够且更灵活。如果需要数据库层面的严格数据唯一性保证,应选择唯一索引。
- 性能需求:普通索引在某些更新操作中可能更高效,尤其是在涉及大量写操作的场景中。
- 系统资源:考虑系统的内存和存储资源,普通索引的change buffer特性可能对系统性能有正面影响。
索引及其选择机制
MySQL中的表可以有多个索引,而使用哪个索引进行查询优化通常由MySQL的查询优化器自动决定。优化器的目标是选择最小化查询成本的执行计划。
索引选择错误的示例
在文档中提供了一个实验案例:
- 创建一个简单的表
t
,包含字段a
和b
,并为这两个字段各自创建索引。 - 向表中插入100000行数据,其中
a
和b
字段的值从1递增到100000。 - 执行查询
select * from t where a between 10000 and 20000
,理论上应优先使用索引a
。
问题出现的条件
在对表进行大量数据删除和再次插入操作后,查询优化器未能选择最佳索引a
,而是进行了全表扫描,导致查询性能显著下降。
优化器逻辑与决策因素
- 扫描行数:优化器评估不同索引方案的扫描行数,越少的扫描行数通常意味着越高的查询效率。
- 其他因素:是否需要使用临时表、是否需要排序等,也会影响优化器的索引选择。
索引的区分度和基数
-
区分度:索引的区分度高意味着通过该索引能更有效地过滤数据。
-
基数:索引的基数是指索引列上不同值的数量。基数的准确性直接影响优化器的选择准确性。
索引选择错误的原因 -
索引的“区分度”和“基数”是优化器决定是否使用某个索引的关键。
-
基数的计算是通过采样统计得出的,这可能导致不精确的结果。
-
采样统计:为了减少计算资源消耗,MySQL通过采样部分数据来估计整个表的索引基数。
统计信息的角色
MySQL通过对表的一部分数据进行采样,来估算索引的基数。若数据分布发生变化(如频繁的插入和删除操作),采样得到的统计信息可能不再准确,从而影响优化器的索引选择。
解决方案和实践建议
- 强制索引使用:通过
force index
语句可以强制查询优化器使用特定索引。 - 监控和调整:通过设置
long_query_time
为0并检查慢查询日志,可以识别并分析由于索引选择不当导致的低效查询。 - 维护统计信息:定期更新表的统计信息,以保持优化器决策的准确性,特别是在数据变动频繁的表上。
结论
在MySQL数据库管理和优化中,理解并正确处理索引选择问题至关重要。优化器虽然大多数时间能自动选择最优索引,但在特定情况下(如数据频繁更新时)也可能出错。开发者需要掌握相关知识和技巧,以确保数据库查询的性能和效率。
相关文章:
MySQL全局锁、表级锁、行锁、死锁、索引选择
文章目录 全局锁表级锁表锁元数据锁 MDL 如何安全的给小表添加字段1. 理解和监控长事务2. 使用NOWAIT和WAIT语法示例 3. 选择合适的时间窗口4. 分阶段执行5. 使用在线DDL工具 行锁死锁普通索引和唯一索引的选择索引基础业务场景分析性能考量实践建议索引及其选择机制索引选择错…...
深入解析算法效率核心:时间与空间复杂度概览及优化策略
算法复杂度,即时间复杂度与空间复杂度,衡量算法运行时资源消耗。时间复杂度反映执行时间随数据规模增长的关系,空间复杂度表明额外内存需求。优化策略,如选择合适数据结构、算法改进、循环展开等,对于提升程序效率、减…...
虚拟机装CentOS镜像
起先,是先安装一个VM虚拟机,再去官方网站之类的下载一些镜像,常见镜像有CentOS镜像,ubantu镜像,好像还有一个树莓还是什么的,软件这块,日新月异,更新太快,好久没碰&#…...
SpringCloud 集成consul,消费者报I/O error on GET request for...
创建消费者微服务,去调用生产者微服务的请求过程中,出现以下错误: 报错原因 因为在使用SpringCloudAlibaba中的Nacos框架时,自动整合了SpringCloud中的Ribbon框架中的负载均衡,因为微服务提供者有两个,在消…...
pytest的测试标记marks
引用打标的marks文档 Python的pytest框架(5)--测试标记(Markers)_pytest执行指定的marker-CSDN博客 https://www.cnblogs.com/pipile/p/12696226.html 给用例自定义打标签的代码示例 #coding:utf-8 import pytest pytest.mark.smoke def test_1():print("smoke的测试用…...
端口占用解决方法
1、查询端口 打开cmd命令提示符窗口,输入以下指令查询所有端口 netstat -ano //查询所有端口 netstat -ano|findstr 8080 //查询指定端口 2、杀死进程 taskkill /t /f /im 进程号(PID)...
Java毕设之基于springboot的医护人员排班系统
运行环境 开发语言:java 框架:springboot,vue JDK版本:JDK1.8 数据库:mysql5.7(推荐5.7,8.0也可以) 数据库工具:Navicat11 开发软件:idea/eclipse(推荐idea) 系统详细实现 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及…...
OpenCV4.8 VS2019 MFC编程出现的诡异现象
OpenCV4.8及OpenCV4.4 VS2019MFC编程在调用imred()函数时,debug X64试运行没问题。 release X64试运行时出现下面错误。 void CEasyPictureDlg::OnBnClickedOpen() {CFileDialog fdlg(TRUE, NULL, 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMP…...
游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)
所用工具下载地址: https://pan.quark.cn/s/d54e7cdc55e6 在上次课程中,我们成功获取了人物对象的基址:[[[0xd75db8]1C]28],而人物血量的地址则是基址再加上偏移量278。 接下来,我们需要执行以下步骤来进一步操作&a…...
【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…...
代码随想录leetcode200题之栈与队列
目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题中栈与队列部分的题目。 2 训练 题目1:232. 用栈实现队列 C代码如下, #include <stack>class MyQueue { private:stack<int> a;stack<int> b; //辅助栈 pu…...
使用Python实现2048小游戏
使用Python实现2048小游戏源码分享。实现效果如下所示。 实现效果图 游戏开始效果图 游戏结束效果图 部分源码截图 下载链接 基于如下的运行环境。运行需要安装tkinter /Library/Frameworks/Python.framework/Versions/3.7/bin/python/bin/python /Users/nihui/Documents/P…...
漏洞管理是如何在攻击者之前识别漏洞从而帮助人们阻止攻击的
漏洞管理 是主动查找、评估和缓解组织 IT 环境中的安全漏洞、弱点、差距、错误配置和错误的过程。该过程通常扩展到整个 IT 环境,包括网络、应用程序、系统、基础设施、软件和第三方服务等。鉴于所涉及的高成本,组织根本无法承受网络攻击和数据泄露。如果…...
LNMT部署jpress
LNMT部署jpress 环境要求: MySQL版本5.6/5.7 tomcat版本9.0.65 源码安装MySQL5.7版 //源码安装MySQL5.7版1关闭防火墙 2创建mysql用户 3上传mysql5.7包(https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.30-linux-glibc2.12-x86_64.tar.g…...
汽车软件研发工具链丨怿星科技新产品重磅发布
“创新引领未来”聚焦汽车软件新基建,4月27日下午,怿星科技2024新产品发布会在北京圆满举行!智能汽车领域的企业代表、知名大企业负责人、投资机构代表、研究机构代表齐聚现场,线上直播同步开启,共同见证怿星科技从单点…...
Faiss原理及使用总结
Faiss(Facebook AI Similarity Search)是一个用于高效相似性搜索和密集向量聚类的库。 一、原理 向量表示与相似度度量:在Faiss中,数据通常被表示为高维向量,这些向量可以来自深度学习模型的特征提取,也可…...
跨越智能建筑桥梁:西门子PLC无缝对接BACnet楼宇自动化系统化
智能楼宇每一个环节的互联互通都至关重要,而PLC(可编程逻辑控制器)作为自动化领域的基石,其与BACnet协议的融合无疑成为了构建智能楼宇神经系统的关键节点。今天,让我们深入探讨如何利用先进的PLC转BACnet协议网关&…...
景源畅信电商:抖音小店有哪些比较热门的宣传方法?
抖音小店的热门宣传方法,是许多商家关注的焦点。在数字化营销时代,有效的宣传手段不仅能提升品牌知名度,还能吸引潜在消费者,促进销售。以下是针对抖音小店热门宣传方法的详细阐述: 一、短视频内容营销 作为抖音的核心…...
兄弟DCP-7057激光打印机报错误代码EC检修及分析
故障描述: 兄弟DCP-7057激光打印机屏幕显示无法打印EC关闭电源,然后重新打开打印机。 故障检修及分析: 1、定影单元风扇的插线连接不良 检查定影单元风扇的插线连接并重新连接; 2、定影单元风扇故障 更换定影单元风扇;…...
【华为】IPSec VPN手动配置
【华为】IPSec VPN手动配置 拓扑配置ISP - 2AR1NAT - Easy IPIPSec VPN AR3NATIPsec VPN PC检验 配置文档AR1AR2 拓扑 配置 配置步骤 1、配置IP地址,ISP 路由器用 Lo0 模拟互联网 2、漳州和福州两个出口路由器配置默认路由指向ISP路由器 3、进行 IPsec VPN配置&…...
面试题分享之Java集合篇(三)
注意:文章若有错误的地方,欢迎评论区里面指正 🍭 系列文章目录 面试题分享之Java基础篇(二)面试题分享之Java基础篇(三) 面试题分享之Java集合篇(一)、 面试题分享之Ja…...
【python】模拟巴特沃斯滤波器
巴特沃斯滤波器(Butterworth Filter),以其设计者斯蒂芬巴特沃斯(Stephen Butterworth)的名字命名,是一种具有平滑频率响应的滤波器。这种滤波器在频域中具有非常平坦的无波纹响应,直到它达到截止…...
面试题:简述Go的垃圾回收机制
Go的GC(Garbage Collection, 垃圾回收)机制主要是用来自动释放不再被程序使用的内存,以防止内存泄漏。Go的垃圾回收是并发的,也就是说,它在主程序运行的同时进行垃圾回收。 1. 标记清除(Mark and Sweep) Go的垃圾回收器主要使用的是标记清除…...
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
第一种:后端返回文件流,前端转换并导出(常用,通常公司都是用这种方式) 第二种:纯后端导出(需要了解) 第三种:纯前端导出(不建议使用,数据处理放…...
初识C语言——第十六天
C语言中的语句结构类型:顺序/选择/循环 分支语句 if else switch 循环语句 while for do whlie goto语句 代码练习:找两个整数的最大公约数和最小公倍数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>//int main() //{ // int age 60; // if (ag…...
Vue的省份联动
Vue的省份联动 一、安装依赖库 npm install element-china-area-data -Snpm install element-ui --save全局使用elemntui组件库 import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;Vue.use(ElementUI);二 、代码如下 <template><div…...
element-ui skeleton 组件源码分享
今日简单分享 skeleton 骨架屏组件源码,主要从以下四个方面来讲解: 1、skeleton 组件的页面结构 2、skeleton 组件的属性 3、skeleton item 组件的属性 4、skeleton 组件的 slot 一、skeleton 组件的页面结构 二、skeleton 组件的属性 2.1 animate…...
深度学习:基于TensorFlow、Keras,使用长短期记忆神经网络模型(LSTM)对Microsoft股票进行预测分析
前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…...
【websocket-客户端可视化工具】
postman 新版postman (版本v11以上) ,除了http协议,还支持了Websocket,MQTT,gRPC等多种连接协议,可以作为多种协议的客户端,使用起来非常方便。 使用 服务端代码 这里以websocket协议举例,代…...
STC8增强型单片机开发——C51版本Keil环境搭建
一、目标 了解C51版本Keil开发环境的概念和用途掌握C51版本Keil环境的安装和配置方法熟悉C51版本Keil开发环境的使用 二、准备工作 Windows 操作系统Keil C51 安装包(可以从Keil官网下载)一款8051单片机开发板 三、搭建流程 环境搭建的基本流程…...
个人博客网站教程/什么时候网络推广
飞跃原野一秒钟杀死互联网。 这就是全部。 昨天的second秒使原子钟与地球自转对齐,导致广泛的在线混乱,因为准备不足的网站和软件花费了额外的秒。 在格林尼治标准时间午夜cho睡的人中,Reddit,Gawker, StumbleUpon&am…...
北京企业网站建设价格/阿里云搜索
通过上面pt-table-checksums找到了这些不一致的数据表(https://blog.51cto.com/li02yu/2340403),如何同步数据呢?即如何修复MySQL主从不一致的数据,让他们保持一致性呢?利用另外一个工具 pt-table-sync。使…...
seo网站架构设计/企业网站建设的作用
1、Linux系统简单介绍 Linux是一套免费使用, 支持多用户、多任务、支持多线程和多个核心CPU的操作系统;很多中型, 大型甚至是巨型项目都在使用Linux。 Linux的发行版说简单点就是将Linux与应用软件做一个打包, 目前市面上比较知名的发行版有: Ubuntu, RedHat, Cen…...
婚庆网站模板免费下载/电子商务网店运营推广
Python中多态的作用 让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容(功能)的函数。 Python中多态的特点 1、只关心对象的实例方法是否同名,不关心对象所属的类型; 2、对象所属的类之间,继承关系…...
保定做网站的公司/分销系统
2019独角兽企业重金招聘Python工程师标准>>> 是这样的,我的项目的框架是 之前 公司统一使用的框架,配置都配置好了的。 大神们说是没有问题的, 我简单过了一下,也没有问题。 在项目上线并完成了好久后。。。就在前几天…...
专业网站建设必要性/药品网络营销公司
粘包产生原因: 先说TCP:由于TCP协议本身的机制(面向连接的可靠地协议-三次握手机制)客户端与服务器会维持一个连接(Channel),数据在连接不断开的情况下,可以持续不断地将多个数据包发…...