频繁插入(insert)的业务,用什么存储引擎更合适? | 数据库系列

开发 开发工具 MySQL
继续回答星球水友提问:沈老师,MyISAM只支持表锁,但网上文章却说,在并发插入量比较大的时候,比较适合使用MyISAM,这矛盾吗?

继续回答星球水友提问:

沈老师,MyISAM只支持表锁,但网上文章却说,在并发插入量比较大的时候,比较适合使用MyISAM,这矛盾吗?

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

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

MySQL表锁知识系统性梳理。

[[278134]]

哪些存储引擎使用表锁?

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

表锁有什么好处?

  • 表锁占用内存少很多,行锁的数量与行记录数相关,非常耗内存;
  • 如果业务经常读写表中很大一部分数据时,表锁会更快,因为此时只涉及一个锁,而不是同时管理N多个锁;
  • 如果业务经常使用group by,表锁会更快,原因同(2);

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

表锁是怎么运作的?

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

写时,要加写锁:

  • 如果表没有锁,对表加写锁;
  • 否则,入写锁队列;

读时,要加读锁:

  • 如果表没有写锁,对表加读锁;
  • 否则,入读锁队列;

表锁释放时:

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

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

如何查看表锁情况?

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

  • able_locks_immediate:立刻获得表锁的次数;
  • Table_locks_waited:需要等待表锁的次数;

这两个变量。

使用以下命令查看:

  1. show status like 'Table%'; 

如果等待表锁的次数占比较大,说明表锁可能是潜在瓶颈。 说了半天,还是没有讲到点子上,为什么在并发插入量比较大的时候,比较适合使用MyISAM呢?不会因为表锁频繁冲突而导致吞吐量降低吗?

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

知识点一:

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

 知识点二:

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

如上图所示:

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

知识点三:

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

空洞是怎么导致的?

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

 

如上图所示:

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

再如上图所示:

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

结论

虽然MyISAM只支持表锁,但高并发select与insert的业务场景,上述机制使得MyISAM的表锁依然有非常强劲的性能。

画外音:本文基于MySQL5.6。

希望解答了这位水友的疑问。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

 

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2022-11-09 10:26:27

存储引擎MySQL数据库

2018-05-02 08:40:36

存储密码字符

2009-02-02 09:31:25

MySQL存储引擎MyISAM

2022-06-15 08:23:42

开发模式mainlinePR

2011-08-05 14:31:04

mysql_conve批量转换MYSQL数据MYISAM

2011-08-01 23:08:33

MySQL存储引擎

2021-02-21 06:33:27

存储引擎物联网

2012-06-08 09:30:51

Access

2023-04-03 08:00:00

数据库NoSQL

2011-09-30 09:14:29

云计算

2020-01-10 10:58:34

ZooKeeperEureka注册中心

2020-11-24 17:22:15

数据库MySQL技术

2016-10-08 18:13:55

数据库性能工具数据库管理系统

2017-06-19 16:20:09

数据库性能工具

2020-06-17 15:01:30

物联网数据库物联网数据库

2019-07-23 15:34:29

MySQL存储引擎

2021-03-08 10:18:55

数据库数据Prometheus

2009-05-08 09:17:48

动态数据库图片

2021-01-10 15:29:53

开源数据库数据库
点赞
收藏

51CTO技术栈公众号