美文网首页MySQL
频繁插入(insert)的业务,用什么存储引擎更合适?

频繁插入(insert)的业务,用什么存储引擎更合适?

作者: zzj0990 | 来源:发表于2021-01-11 22:59 被阅读0次

最近看到网上有些帖子说到,MyISAM只支持表锁,在并发量比较大的时候,比较适合使用MyISAM。这矛盾么?
这个问题,涉及MySQL表锁的一些细节,借着这个问题,系统性说下表锁的内幕。

MySQL表锁知识系统性管理

  1. 哪些存储引擎使用表锁?
    MySQL,除InnoDB支持行锁外,MySQL的其他存储迎请均只使用表锁,例如:MyISAM,MEMOER,MERGE等。
    2.表锁有什么好处?
    (1)表锁占用内存少很多,行锁的数量与行记录数相关,非常耗内存;
    (2)如果业务经常读写表中很大一部分数据时,表锁会更快,因为此时只涉及一个锁,而不是同时管理N多个锁;
    (3)如果业务经常使用group by,表锁会更快,原因同(2);
    内涵:这样的一些场景,使用MyISAM比InnoDB更优

  2. 表锁是怎么运作的?
    写时,要加写锁:
    (1)如果表没有锁,对表加写锁;
    (2)否则,入写锁队列;

读时,要加读锁:
(1)如果表没有写锁,对表加读锁;
(2)否则,入读锁队列;

  1. 表锁释放时:
    如果写锁队列和读锁队列里都有锁,写有更高的优先级,即写锁队列先出列。这么做的原因是,如果有“大查询”,可能会导致写锁被批量“饿死”,而写锁往往释放很快。
    潜台词是:如果有大量并发update请求,select会等所有update请求执行完才执行。
  2. 如何查看表锁情况?
    使用以下命令查看:
    show status like 'Table%';


    image.png

    Table_locks_immediate:立刻获得表锁的次数;
    Table_locks_waited:需要等待表锁的次数;
    如果等待表锁的次数占比较大,说明表锁可能是潜在瓶颈。

说了半天,还是没有讲到点子上,为什么在并发插入量比较大的时候,比较适合使用MyISAM呢?不会因为表锁频繁冲突而导致吞吐量降低吗?
潜台词:知识的系统性,比问题答案更重要。

知识点一:
MyISAM的索引与记录存储分离,有单独的区域存储行记录,PK是非聚集索引

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

image.png

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

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

空洞是怎么导致的?
删除或者修改数据,都可能导致空洞。


image.png

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

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

相关文章

  • 频繁插入(insert)的业务,用什么存储引擎更合适?

    最近看到网上有些帖子说到,MyISAM只支持表锁,在并发量比较大的时候,比较适合使用MyISAM。这矛盾么?这个问...

  • InnoDB 关键特性

    InnoDB存储引擎的关键特性包括: 插入缓冲(Insert Buffer) 两次写(Double Write) ...

  • 2021-10-08

    innodb存储引擎插入缓存将更新操作放入到insert buffer,然后以一定的频率刷将insert buff...

  • MySQL表的各种类型

    一、常用类型 存储引擎事务锁颗粒主要应用忌用MYISAM不支持支持并发插入的表级锁SELECT,INSERT读写操...

  • MySQL-InnoDB关键特性

    作者:刘仁鹏参考资料:《MySQL技术内幕:InnoDB存储引擎》 1.插入缓冲 1.Insert Buffer ...

  • mysql存储引擎

    存储引擎是mysql数据库最重要的特性之一,用户可以根据自身需求选择合适的存储引擎,例如:是否支持事务、批量插入速...

  • 一次insert into on duplicate key u

    问题 最近有业务场景使用insert into ... on duplicate key update进行插入更新...

  • Mongodb存储引擎

    插件式存储引擎API 插件式存储引擎API的引入为处理更多不同类型的业务提供了无限可能,内存存储引擎、事务存储引擎...

  • MySQL面试题和答案

    Mysql 的存储引擎,myisam和innodb的区别。答: 1.MyISAM 是非事务的存储引擎,适合用于频繁...

  • 面试题2

    Mysql 的存储引擎,myisam和innodb的区别。答: 1.MyISAM 是非事务的存储引擎,适合用于频繁...

网友评论

    本文标题:频繁插入(insert)的业务,用什么存储引擎更合适?

    本文链接:https://www.haomeiwen.com/subject/mcmjaktx.html