MST

星途 面试题库

面试题:MySQL MyISAM存储引擎锁机制与InnoDB存储引擎锁机制深度对比及应用场景选择

深入对比MySQL MyISAM和InnoDB存储引擎的锁机制,包括锁的类型、粒度、加锁时机、释放时机等方面。同时,举例说明在不同业务场景(如高并发读、高并发写、读写混合等)下,应如何选择这两种存储引擎以达到最优性能和数据一致性。
50.4万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

锁类型

  • MyISAM:只有表级锁,即对整个表进行锁定。分为读锁(共享锁)和写锁(排他锁)。
  • InnoDB:支持行级锁、表级锁。行级锁又分为共享锁(S锁)和排他锁(X锁);表级锁有意向共享锁(IS锁)、意向排他锁(IX锁)等。

锁粒度

  • MyISAM:锁粒度为表级,加锁和解锁的开销小,但并发性能差,因为一个事务对表加锁后,其他事务对该表的任何操作都需等待锁释放。
  • InnoDB:锁粒度细,行级锁可针对具体行操作,在高并发场景下,多个事务可操作不同行,提高并发性能,但加锁和解锁开销相对大。

加锁时机

  • MyISAM:在执行查询(SELECT)时,会对表加读锁;执行写操作(INSERT、UPDATE、DELETE)时,对表加写锁。
  • InnoDB
    • 对于普通SELECT语句,默认不加锁,采用的是MVCC(多版本并发控制)来实现高并发读取。若要加锁,可使用SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE语句。
    • 执行INSERT、UPDATE、DELETE操作时,会自动对涉及的行加排他锁,同时会根据隔离级别等因素添加意向锁等表级锁来保证事务一致性。

释放时机

  • MyISAM:在事务结束(COMMIT或ROLLBACK)或者连接关闭时释放锁。
  • InnoDB:在事务结束(COMMIT或ROLLBACK)时释放锁。但在某些隔离级别下,锁可能提前释放,例如在READ COMMITTED隔离级别下,InnoDB会在语句执行完后释放非范围锁。

不同业务场景选择

  • 高并发读场景
    • 选择MyISAM:MyISAM的表级读锁允许并发读操作,因为读锁是共享的,多个事务可同时对表进行读取,且表级锁开销小,适用于以读为主,写操作极少的场景,如新闻网站文章浏览等。
    • 选择InnoDB:InnoDB的MVCC机制能实现高并发读,且读操作默认不加锁,性能也不错。如果读操作中有对数据一致性要求较高,需要加锁读的情况,InnoDB的行级锁能更细粒度控制,减少锁争用,比MyISAM更适合。例如银行账户余额查询等对数据一致性要求高的读操作场景。
  • 高并发写场景
    • 选择MyISAM:MyISAM表级写锁会严重影响并发性能,因为同一时间只允许一个事务进行写操作,其他事务需等待,所以不适合高并发写场景。
    • 选择InnoDB:InnoDB的行级锁允许不同事务对不同行进行写操作,大大提高并发写性能。例如电商系统的订单处理,多个订单可同时处理,减少等待时间。
  • 读写混合场景
    • 选择MyISAM:由于MyISAM表级锁机制,读操作和写操作相互排斥,读写混合场景下,会频繁出现锁争用,性能较差,一般不适合。
    • 选择InnoDB:InnoDB通过MVCC和行级锁,能较好平衡读写操作。读操作通过MVCC避免锁争用,写操作利用行级锁减少对读操作影响,适用于大多数读写混合场景,如社交平台的动态发布与浏览等场景。