MySQL 存储引擎

发布于 2024-11-15 09:20:31 字数 2632 浏览 13 评论 0

InnoDB 和 MyISAM 怎么发音

InnoDB 发音方式是 in-no-dee-beeMyISAM 发音方式是 my-eye-sam

InnoDB 和 MyISAM 区别是什么

InnoDBMyISAM 都是使用 b+树实现索引的,索引的类别分成 主键索引(Primary Inkex) 与 普通索引(Secondary Index) ,两个 data engine 都是比较常用的引擎。

  • InnoDB 支持事务, MyISAM 不支持事务(MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一)
  • InnoDB 最小的锁粒度是行锁, MyISAM 最小的锁粒度是表锁.一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限.(MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一)
  • InnoDB 支持外键,而 MyISAM 不支持
  • InnoDB 是聚集索引, MyISAM 是非聚集索引,详情见 1 分钟了解 MyISAM 与 InnoDB 的索引差异
    • MyISAM : 索引与行记录是分开存储的,叫做 非聚集索引(UnClustered Index)MyISAM 可以没有主键,其主键索引与普通索引没有本质差异:
      • 有连续聚集的区域 单独存储行记录 (主键和数据分开存储)
      • 主键索引的叶子节点,存储 主键 ,与对应行记录的 指针
      • 普通索引的叶子节点,存储 索引列 ,与对应行记录的 指针 (普通索引和主键索引没有太大区别)
        MyISAM-index
    • InnoDB : 主键索引与行记录是存储在 一起 的,故叫做 聚集索引(Clustered Index)
      • 没有 单独区域存储行记录(主键和数据统一存储)
      • 主键索引的叶子节点, 存储主键与对应行记录 (而不是指针,InnoDB 的主键查询是非常快的)
      • InnoDB 的表 有且只有一个聚集索引 (因为每一个叶子节点都对应一行数据),这个特性导致:
        • 如果表定义了 PK,则 PK 就是聚集索引
        • 如果表没有定义 PK,则第一个非空 unique 列是聚集索引
        • 否则,InnoDB 会创建一个隐藏的 row-id 作为聚集索引
      • 由上面的特性产生了一个建议: 建议 使用趋势递增 的 key 做主键,由于数据行与索引一体,这样不至于插入记录时,有大量索引分裂,行记录移动
      • 普通索引可以有多个,普通索引的叶子节点存储的是 主键 ( innodb 不建议使用较长的列做主键 会导致普通索引过于庞大 ),所以 innodb 在普通所以查询的时候其实是差了两次索引树(先从普通索引查找记录的主键, 然后查找聚集索引中的实际数据)
        InnoDB-index
  • InnoDB 不保存表的具体行数, MyISAM 用一个变量保存了整个表的行数, select count(*) from tableInnoDB 需要全表扫描,而 MyISAM 只需要读出该变量即可,速度很快
  • InnoDB 在磁盘中保存成同一个文件其大小受制于操作系统,一般为 2GB, MyISAM 存储成三个文件: 表定义文件 .frm ,数据文件 .MYD (MYData),索引文件 .MYI (MYIndex)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

三岁铭

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文