• 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)存放索引和数据文件, 索引和数据在一个文件中就被称为聚簇索引.

  • 相关阅读:
    平行哲学与智能技术:平行产业与智慧社会的对偶方程与测试基础
    AUTOSAR从入门到精通-基于 CAN 总线的汽车发电机智能调节器(下)
    机器学习从0到1
    .NET 6学习笔记(4)——解决VS2022中Nullable警告
    java中比较两个map是否相同
    探索 LinkedList 原理
    cpp占位参数在重载运算符中的作用
    java.lang.ClassNotFoundExceptioncom.mysql.cj.jdbc.Driver解决方法
    关于面向对象的方法并行执行的问题
    吃透这份高并发/调优/分布式等350道面试宝典,已涨30k
  • 原文地址:https://blog.csdn.net/LionHearthz/article/details/126257616