MySQL 存储引擎

发布于 2024-11-15 09:20:31 字数 2632 浏览 2 评论 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技术交流群

发布评论

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

关于作者

三岁铭

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

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