MySQL 存储引擎
InnoDB 和 MyISAM 怎么发音
InnoDB
发音方式是 in-no-dee-bee
, MyISAM
发音方式是 my-eye-sam
InnoDB 和 MyISAM 区别是什么
InnoDB
和 MyISAM
都是使用 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 table
时InnoDB
需要全表扫描,而MyISAM
只需要读出该变量即可,速度很快InnoDB
在磁盘中保存成同一个文件其大小受制于操作系统,一般为 2GB,MyISAM
存储成三个文件: 表定义文件.frm
,数据文件.MYD
(MYData),索引文件.MYI
(MYIndex)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论