面试题答案
一键面试数据存储结构差异
- InnoDB:
- 采用聚簇索引,数据和索引存储在一起,主键索引的叶子节点存储的是完整的数据行。辅助索引叶子节点存储的是主键值,通过主键值再去主键索引中查找完整数据行,这种方式叫回表。
- 支持事务,有事务日志(redo log和undo log)用于崩溃恢复和事务回滚等操作,保证数据的一致性和完整性。
- 表空间较大,因为除了数据,还需要存储事务相关信息等。
- MyISAM:
- 索引和数据是分离的,索引文件和数据文件分别存储。主键索引和辅助索引的叶子节点都只存储数据的物理地址。
- 不支持事务,没有事务相关的日志机制。
- 表空间相对较小,数据文件结构简单。
锁机制差异
- InnoDB:
- 支持行级锁和表级锁,默认采用行级锁。行级锁能精确锁定到具体的行,并发控制更细粒度,在高并发写操作时能减少锁争用。
- 事务支持锁的自动释放,当事务提交或回滚时,锁会自动释放。
- MyISAM:
- 只支持表级锁,在进行写操作(插入、更新、删除)时会锁定整个表,读操作(查询)时也会锁定表,这使得在高并发场景下,锁争用问题较为严重。
- 锁的释放是在操作完成后立即释放,而不是在事务结束时。
对查询性能影响
- 高并发读场景:
- InnoDB:虽然支持行级锁,但由于事务机制,会有一定的额外开销,不过因为行级锁能减少锁争用,在高并发读场景下性能也较为不错。如果查询的是主键索引,可以直接获取数据,性能较好;如果是辅助索引,可能需要回表操作,会有一定性能损耗。
- MyISAM:由于只支持表级锁,在高并发读时,虽然读操作本身不阻塞其他读操作,但如果有写操作,会等待读锁释放,可能导致读操作也被阻塞。整体性能在高并发读场景下不如InnoDB。
- 高并发写场景:
- InnoDB:行级锁的优势明显,不同的写操作可以锁定不同的行,从而减少锁争用,在高并发写场景下性能更好。事务机制也保证了数据的一致性,即使在并发写过程中出现问题,也能通过事务回滚保证数据正确。
- MyISAM:表级锁在高并发写时,每次写操作都要锁定整个表,其他写操作和读操作都要等待锁释放,严重影响并发性能,所以在高并发写场景下性能较差。
- 单条复杂查询场景:
- InnoDB:如果查询涉及到多表关联等复杂操作,由于聚簇索引结构和事务机制,可能会有一定的性能开销。但是如果查询条件能很好地利用索引,特别是主键索引,性能也可以得到保障。
- MyISAM:索引和数据分离的结构,在复杂查询时,通过索引找到数据位置后直接读取,理论上在简单的单条复杂查询场景下性能可能稍好,但如果查询涉及到大量数据的扫描,由于表级锁可能会对其他操作产生影响,整体性能优势不明显。