Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
    • 说说 InnoDB 与 MyISAM 的区别
      • drop、truncate、delete 的区别
      • 聊一聊数据库事务机制
      • 聊一聊 MySQL 中的关联查询
      • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
      • 分库分表之后,id 主键如何处理?
      • 说说在 MySQL 中一条查询 SQL 是如何执行的?
      • 讲解下 DDL、DML、DCL
      • 存储过程和触发器的作用
      • MySQL 如何行转列和列转行
      • 如何查看 SQL 的执行计划
      • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    说说 InnoDB 与 MyISAM 的区别

    yISAM 是 MySQL 的两种核心存储引擎,在事务支持、锁机制、索引结构、数据持久化等方面差异显著,具体对比如下:

    对比维度 InnoDB MyISAM
    事务支持 支持 ACID 事务(原子性、一致性、隔离性、持久性),支持 COMMIT/ROLLBACK 不支持事务,操作是原子的(要么全部完成,要么全部失败)
    锁机制 支持行级锁(S 锁 / X 锁)和表级锁,支持间隙锁(避免幻读) 仅支持表级锁(读锁 / 写锁),无行级锁
    索引结构 聚簇索引(主键索引叶子节点存储行数据),非主键索引叶子节点存储主键值 非聚簇索引(索引和数据分开存储,索引叶子节点存储数据地址)
    主键要求 必须有主键(无显式主键时,自动生成隐藏 row_id) 无主键要求,可无主键或主键重复
    外键支持 支持外键约束(FOREIGN KEY),确保数据完整性 不支持外键约束
    数据持久化 支持崩溃恢复(通过 redo 日志和 undo 日志),数据安全性高 不支持崩溃恢复,崩溃后可能丢失数据(仅通过备份恢复)
    表空间存储 支持独立表空间(.ibd 文件,每表一个文件)和系统表空间(ibdata1) 表数据存储在.frm(表结构)、.MYD(数据文件)、.MYI(索引文件)
    全文索引支持 JDK 5.6 及之后支持全文索引(FULLTEXT) 早期版本支持全文索引,是其核心优势之一
    COUNT (*) 查询性能 需遍历表或索引计数(聚簇索引需扫描所有行),性能低 存储表的总行数,COUNT(*)直接返回结果,性能高
    适用场景 高并发、需事务支持的场景(如电商订单、金融交易) 只读或写少读多的场景(如博客、新闻网站)

    # 关键差异详解

    • 1. 事务与数据安全性:
      • InnoDB:通过 redo 日志(记录已提交的修改)和 undo 日志(记录未提交的修改)实现事务和崩溃恢复,即使 MySQL 崩溃,重启后可通过日志恢复数据,确保持久性;
      • MyISAM:无日志机制,崩溃后若数据文件损坏,需通过myisamchk工具修复,可能丢失数据,安全性低。
    • 2. 锁机制与并发性能:
      • InnoDB:行级锁支持高并发(如多个事务可同时修改不同行的数据),间隙锁避免幻读;但行级锁实现复杂,开销略高;
      • MyISAM:表级锁在写操作(UPDATE/DELETE/INSERT)时会锁定整个表,其他读 / 写操作需等待,并发性能差(如 100 个写操作需排队执行)。
    • 3. 索引与查询性能:
      • InnoDB:聚簇索引查询主键数据时无需回表,效率高;但非主键查询需先查非主键索引,再查聚簇索引(回表),效率略低;
      • MyISAM:非聚簇索引的叶子节点存储数据地址,查询时直接通过地址读取数据,无需回表;但无聚簇索引,主键查询无优势。
    • 4. COUNT (*) 性能:
      • MyISAM 在表结构中存储总行数,执行SELECT COUNT(*) FROM table时直接返回存储的数值,无需扫描表;
      • InnoDB 无总行数存储,需扫描聚簇索引或非主键索引计数(若非主键索引更小,会选择非主键索引),数据量越大,性能越差。

    上次更新: 12/30/2025
    数据库的三范式是什么?
    drop、truncate、delete 的区别

    ← 数据库的三范式是什么? drop、truncate、delete 的区别→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式