MySQL支持多种存储引擎,其中最常用的InnoDB和MyISAM,他俩的主要区别呢,就是一个支持事务,一个不支持事务,一个查询的快一个查询的慢一些,其实对于新的项目可以自由的选择,但是对于已经运行了很多年的系统,想要切换就很难。
事情的起因事什么呢,手术护理系统在确认了患者的信息之后,把所有需要用到的数据表中加入这个患者的基本信息创建一条数据,但是现在出现了这样一个情况, 在网络不好或者请求重复的情况下,可能会每个表中都存在OPERATIONID 相同的数据两条或者三条以上的重复性数据,导致数据在联查的时候出错,但是目前数据库的数据量很大,可能改不了主键来限制的方法。
于是呢就想到要可以用锁来解决这个问题,但是现在的收据库类型使用的事MyISAM类型,为什么要使用这个类型呢,因为数据库的属于越来越多,查询的速度越来越慢,在使用InnoDB的情况下,查询的速度要比使用MyISAM慢好几倍,为什么MyISAM的查询更快呢,因为MyISAM:索引与数据分离全表扫描时更快。
由于用的是MyISAM所以没有办法使用事务和行锁,那么就尝试一下使用表级锁;
1. MyISAM:表级锁(Coarse-Grained Locking)
工作机制:MyISAM仅支持表级锁,任何写操作(INSERT/UPDATE/DELETE)都会锁定整个表,阻塞所有其他读写操作。读操作(SELECT)会施加共享锁,允许多个查询并发,但与写操作互斥
时会话B需等待会话A的UNLOCK TABLES才能执行,这样就有点卡巴了,会话B还得等一会才能执行,我感觉有点坑,影响使用体验,所以我放弃了这个方案,先还是保持现状吧。
最后做个总结
MyISAM:适合只读为主的场景(如数据仓库),优势在简单查询速度和低内存开销,但表级锁和缺乏事务是其硬伤。
InnoDB:适用于高并发写入和需事务的场景(如电商),行级锁和MVCC保障并发性能与数据安全,通过索引优化可缩小查询差距。
在SSD和内存成本下降的当下,InnoDB+硬件优化已成为主流方案。MyISAM仅建议用于归档数据或特定只读负载,新项目应优先InnoDB。