浅谈MySQL存储引擎


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存储引擎)