美文网首页
浅谈MySQL存储引擎

浅谈MySQL存储引擎

作者: 程序员小韩 | 来源:发表于2022-03-08 13:58 被阅读0次

    MySQL 的存储引擎是插件式的,不同的存储引擎有不同的锁机制,其中我们最常到的两个存储引擎为 MyISAM 与 InnoDB。

       MyISAM 与 InnoDB的区别:


     MyISAM

      • 不支持事务,但是每次查询都是原子的;

      • 支持表级锁,即每次操作是对整个表加锁;    

      • 存储表的总行数;

      • 一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件;

      • 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引 基本一致,但是辅索引不用保证唯一性。 

        InnoDB: 

      • 支持 ACID 的事务,支持事务的四种隔离级别;

      • 支持行级锁及外键约束:因此可以支持写并发;

      • 不存储总行数:一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为 2G),受操作系统文件大小的限制;

      • 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持 B+树结构,文件的大调整。

        下面这个图可能更直观些:


    MyISAM 与 InnoDB的索引实现


            MyISAM 的索引是非聚簇索引。索引文件和数据文件是分离的,底层是B+树作为索引结构,叶子节点data存放的是数据记录指针的地址,这种索引结构为非聚簇索引。


            myisam中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。结构如下图:


            InnoDB 的索引是聚簇索引。与MyISAM 的区别就是InnoDB的数据文件就是索引文件,叶子节点data存放的是数据的整条记录。这种索引结构为聚簇索引。


    结构如下图:

            因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有)


    • 如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引。

    • 如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键

    • 如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。(隐含字段)


    MyISAM 与 InnoDB的区别适用场景:


    MyISAM 适合的场景为:

    • 需要频繁执行全表 count 语句

    • 对数据进行增删改的频率不高,查询非常频繁

    • 没有事务

    • MyISAM 使用的索引是非聚簇索引

    InnoDB 适合的场景为:

    • 数据增删改查都比较频繁

    • 可靠性要求高,需要支持事务

    • 使用聚簇索引


    ……………分割线……………

    不积跬步,无以至千里;不积小流,无以成江海。

    关注我,每天分享一些小知识点。分享自己的小心得,包含但不限于初、中、高级面试题呦!!!


    我都墨迹这么半天了 ,你不点关注,不点赞,不收藏,还不转发,你想干啥!!!!


    相关文章

      网友评论

          本文标题:浅谈MySQL存储引擎

          本文链接:https://www.haomeiwen.com/subject/udsarrtx.html