MySQL面试之---MyISAM与InnoDB的区别

区别:

  1. 事务: InnoDB支持事务(四种隔离级别), 事务安全, MyISAM不支持事务, 每次查询都是原子的.
  2. 锁: InnoDB行级锁, MyISAM只能针对于表加锁
  3. 外键: InnoDB支持外键, MyISAM不支持. 但是规范上最好不使用外键.
  4. 索引: InnoDB MySQL5.6支持全文索引, 5.6 之前MyISAM支持全文索引
  5. 索引的存储方式: InnoDB聚簇索引, MyISAM非聚簇索引.
  6. 总行数: MyISAM存储总行数, innodb不存储总行数.
事务 外键 锁粒度 索引存储方式 表空间 关注点
InnoDB 表锁和行锁 聚簇和非聚簇 事务,高并发
MyISAM × × 只有表锁 只非聚簇 性能

使用场景:

MyISAM效率快于InnoDB但是只适用于小型应用(因为表空间小), 跨平台支持(把表保存成文件), 还有就是大量的select.

==面试延伸: ==
如果问到了: 聚簇索引 可以(可能)引申到-> B树, B+树
点击此处链接

如果有很大帮助, 拜托点个赞, 说实话点个赞的话真的我能开心一天.




以下是补充和说明:

InnoDB事务的四种隔离级别

READ UNCOMMITTED读未提交
READ COMMITTED读已提交 (最常用的隔离级别)
REPEATABLE READ可重复读 (InnoDB默认)
SERIALIZABLE串行化

引申问题:

  1. 分别解决什么问题? 怎么解决的?
    读未提交会产生脏读, 不可重复读, 幻读问题.
    实现: 读不加锁, 所有的写加行级锁.
    读已提交避免了脏读现象, 存在不可重复读和幻读问题.
    实现: 使用MVCC技术, 在每一行加入隐藏的字段(DB_TRX_ID: 修改该行的最后一个事务的id, DB_ROLL_PTR: 指向当前行的undo log日志, DB_ROW_ID: 行标识, DBLETE_BIT: 删除标志)
    也是读不加锁, 写加行级锁.
    每次写入数据, 数据行中隐藏列DATA_POLL_PTR存储指向UNDO记录的指针.
    每次读数据, 如果该行被其他事务锁定,顺着隐藏列DATA_POLL_PTR指针, 找到上一个有效的记录
    可重复读防止了脏读和不可重复读, 存在幻读.
    也是MVCC实现, 写加行级锁, 读不加锁. 和读已提交的区别就是行记录对于当前事务的可见性. 读已提交对数据的可见性是该数据的最新记录, 而可重复读对数据的可见性是事务开始时, 该数据的记录.
    串行, 防止脏读, 幻读, 不可重复读. 但是并发效率最低.
    实现: 读写全部加锁.
  2. 怎么看隔离级别 show variables like ‘transaction%’
  3. 怎么设置隔离级别 set [session/global] transaction level xxx

什么是聚簇索引和非聚簇索引?

MyISAM和InnoDB除了表结构文件都是.frm文件之外,
MyISAM有两个文件存储信息, .myd(d代表Data存放数据)和 .myi(i代表Index存放索引), 索引文件的数据域存储指向数据文件的指针.
InnoDB只有一个**.ibd**文件(d代表data)存放索引和数据文件, 索引和数据在一个文件中就被称为聚簇索引.

你可能感兴趣的:(MySQL,面试,mysql,java)