由于目前接触到的客户还在使用MyISAM存储引擎,所以抽空看了一下MyISAM存储引擎的一些知识。
由于在2010年MySQL默认的存储引擎已经是Innodb存储引擎了,所以一直是深入了解的是InnoDB相关的知识。
结论一:MyISAM存储引擎默认SELECT语句会在表级别加一个共享读锁(table read lock)。
结论二:MyISAM存储引擎表会优先执行DML语句,即使是先接受到SELECT语句。
如何验证上述两个结论?
验证方案:因为MyISAM引擎表不支持事务,所以我们不能像InnoDB表一样开启一个事务,来查看当前有哪些锁。所以通过模拟并发的操作,第一个session做select操作,第二个session做更新操作,第三个session执行show full processlist;查看语句当前执行的状态。
验证步骤:
1、首先插入2千万行的数据到myisam表中。
2、然后打开三个MySQL连接窗口,并准备好下面的语句。第一个session查询某一个值;第二个session执行更新操作,更新所有的行;第三个执行show full processlist;
3、然后依次执行三个窗口的SQL语句。
通过上述两个结论我们可以得出以下几条结论
结论三:MyISAM可以用于非事务性数据系统,可以接受宕机导致数据丢失、并且只有读操作的场景,并不适用于读多写少的场景。因为我们上面看到了读写是互斥的,这在InnoDB存储引擎是不会发生的,InnoDB通过行多版本并发控制很好的解决了读写互斥的问题,并且保证在读取时,读取到的是已经提交了的数据。