0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL表锁知识系统性梳理

dyquk4xk2p3d 来源:良许Linux 作者:良许Linux 2022-10-09 11:47 次阅读

这个问题,涉及MySQL表锁的一些细节,借着这个问题,系统性说下表锁的“所以然”。

画外音:网上不少文章只说结论,不说为什么,容易让人蒙圈。

MySQL表锁知识系统性梳理。

哪些存储引擎使用表锁?

MySQL,除InnoDB支持行锁外,MySQL的其他存储引擎均只使用表锁,例如:MyISAM, MEMORY, MERGE等。

表锁有什么好处?

(1)表锁占用内存少很多,行锁的数量与行记录数相关,非常耗内存;

(2)如果业务经常读写表中很大一部分数据时,表锁会更快,因为此时只涉及一个锁,而不是同时管理N多个锁;

(3)如果业务经常使用group by,表锁会更快,原因同(2);

画外音:这样的一些场景,使用MyISAM比InnoDB更优。

表锁是怎么运作的?

和其他临界资源的读写锁类似。

写时,要加写锁:

(1)如果表没有锁,对表加写锁;

(2)否则,入写锁队列;

读时,要加读锁:

(1)如果表没有写锁,对表加读锁;

(2)否则,入读锁队列;

表锁释放时:

如果写锁队列和读锁队列里都有锁,写有更高的优先级,即写锁队列先出列。这么做的原因是,如果有“大查询”,可能会导致写锁被批量“饿死”,而写锁往往释放很快。

画外音:潜台词是,如果有大量并发update请求,select会等所有update请求执行完才执行。

如何查看表锁情况? 如果要分析表锁冲突情况,可查看:

Table_locks_immediate:立刻获得表锁的次数;

Table_locks_waited:需要等待表锁的次数;

这两个变量。 使用以下命令查看:

show status like ‘Table%’;

b2febc4a-45e5-11ed-96c9-dac502259ad0.png

如果等待表锁的次数占比较大,说明表锁可能是潜在瓶颈。

说了半天,还是没有讲到点子上,为什么在并发插入量比较大的时候,比较适合使用MyISAM呢?不会因为表锁频繁冲突而导致吞吐量降低吗?

画外音:知识的系统性,比问题答案更重要。

知识点一:

MyISAM的索引与记录存储分离,有单独的区域存储行记录,PK是非聚集索引。

b33ed136-45e5-11ed-96c9-dac502259ad0.png

这个知识点就不展开了,以前讲过。

知识点二:

MyISAM表,如果数据文件(data file)紧密存储,中间没有空闲块(free blocks),数据总是插入到数据文件的尾部(end),就如同追加日志一样,性能很高,此时的并发insert与select是不加锁的(lock free)。

b35201f2-45e5-11ed-96c9-dac502259ad0.png

如上图所示:

(1)数据文件连续且紧密的存储着; (2)并发insert无表锁争抢(只需插入队列互斥); (3)insert只在数据文件的尾部进行; (4)并发select也能够同时进行(共享读锁); 知识点三:

MyISAM表,如果数据文件(data file)中间有空洞(hole),上述机制会失效,直到空洞被新数据填满,又会启用不加锁机制。 空洞是怎么导致的?

删除或者修改数据,都可能导致空洞。

b36e1144-45e5-11ed-96c9-dac502259ad0.png

如上图所示:

(1)中间删除了一些数据,导致中间出现空闲块(free blocks); (2)此时,select和insert会有表锁冲突,无法并发;

b3861fe6-45e5-11ed-96c9-dac502259ad0.png

再如上图所示:

(1)随着插入的进行,中间的空闲块又被填满了; (2)此时,并发select和insert又恢复了; 结论

虽然MyISAM只支持表锁,但高并发select与insert的业务场景,上述机制使得MyISAM的表锁依然有非常强劲的性能。 画外音:本文基于MySQL5.6。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6723

    浏览量

    88351
  • 存储
    +关注

    关注

    13

    文章

    4136

    浏览量

    85335
  • MySQL
    +关注

    关注

    1

    文章

    789

    浏览量

    26301

原文标题:频繁插入,用什么存储引擎更合适?| 数据库系列

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于MySQL机制

    在数据库系统中,为了保证数据的一致和并发控制,机制发挥着至关重要的作用。尤其在关系型数据库MySQL中,其独特的机制设计更是赢得了许多
    的头像 发表于 09-30 11:16 760次阅读

    mysql中文参考手册chm

    数据库类型 10 从 MySQL 得到最大的性能 10.1 优化概述 10.2 系统/编译时和启动参数的调节 10.2.1 编译和链接如何影响 MySQL 的速度 10.2.2 磁盘
    发表于 12-26 13:32

    MySQL分区类型及介绍

    分区是将一个的数据按照一定规则水平划分成不同的逻辑块,并分别进行物理存储,这个规则就叫做分区函数,可以有不同的分区规则。通过show plugins语句查看当前MySQL是否支持
    发表于 06-29 16:31

    mysql的结构修改、约束

    mysql结构修改、约束(二)
    发表于 05-21 10:26

    镜像对系统性能的影响有哪些?

    镜像抑制基础知识可减少AD9361和AD9371中正交不平衡的技术镜像的来源、含义及对系统性能的影响
    发表于 03-29 07:59

    MySQL存储引擎简析

    MySQL存储引擎InnoDB  InnoDB 的存储文件有两个,后缀名分别是.frm和.idb,其中.frm是的定义文件,而.idb是数据文件。InnoDB 中存在和行
    发表于 09-06 06:07

    嵌入式系统概述知识梳理

    《嵌入式系统》 |(一)嵌入式系统概述 知识梳理《嵌入式系统》 |(二)ARM Cortex M3 体系结构
    发表于 12-22 06:53

    新手必看!FPGA的系统性学习

    本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的傻瓜式讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性
    的头像 发表于 09-28 11:52 2416次阅读
    新手必看!FPGA的<b class='flag-5'>系统性</b>学习

    MySQL中的高级内容详解

    MySQL 进阶!!! 本文思维导图如下。 事务控制和锁定语句 我们知道,MyISAM 和 MEMORY 存储引擎支持级锁定(table-level locking),InnoDB 存储引擎支持行级锁定
    的头像 发表于 03-11 16:55 2133次阅读
    <b class='flag-5'>MySQL</b>中的高级内容详解

    MySQL是怎么加行级的?有什么规则?

    是不是很多人都对 MySQL 加行级的规则搞的迷迷糊糊,对记录一会加的是 next-key ,一会加是间隙,一会又是记录
    的头像 发表于 11-17 09:28 722次阅读

    MySQL索引下推知识分享

    Mysql 是大家最常用的数据库,下面为大家带来 mysql 索引下推知识点的分享,以便巩固 mysql 基础知识,如有错误,还请各位大佬们
    的头像 发表于 12-27 09:49 589次阅读

    一文彻底搞懂MySQL究竟的啥1

    MySQL系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊一聊MySQL。 只要学计算机,「``」永远是一个绕不过的话题。
    的头像 发表于 03-03 10:12 409次阅读
    一文彻底搞懂<b class='flag-5'>MySQL</b><b class='flag-5'>锁</b>究竟<b class='flag-5'>锁</b>的啥1

    一文彻底搞懂MySQL究竟的啥2

    MySQL系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊一聊MySQL。 只要学计算机,「``」永远是一个绕不过的话题。
    的头像 发表于 03-03 10:13 386次阅读
    一文彻底搞懂<b class='flag-5'>MySQL</b><b class='flag-5'>锁</b>究竟<b class='flag-5'>锁</b>的啥2

    LDO基础知识:噪声-降噪引脚如何提高系统性

    LDO基础知识:噪声-降噪引脚如何提高系统性
    的头像 发表于 09-18 10:58 1120次阅读
    LDO基础<b class='flag-5'>知识</b>:噪声-降噪引脚如何提高<b class='flag-5'>系统性</b>能

    MySQL数据库基础知识

    的基础知识,包括其架构、数据类型、操作、查询语句和数据导入导出等方面。 MySQL 数据库架构 MySQL 数据库由多个组件组成,包括服务器、存储引擎和客户端等。
    的头像 发表于 11-21 11:09 848次阅读