一、二者区别?
-
InnoDB 支持事务,MyISAM 不支持事务。(MySQL 将默认存储引擎从 MyISAM (5.1之前) 变成 InnoDB 的重要原因)
-
InnoDB 支持外键,MyISAM 不支持
-
InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针
-
InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。MyISAM 用一个变量保存了整个表的行数。执行是可以直接返回
-
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,导致并发访问受限。(MySQL 将默认存储引擎从 MyISAM (5.1之前) 变成 InnoDB 的重要原因)
二、两个引擎特点
1、MyISAM索引文件和数据文件是分离的(非聚集/簇)
表存储在磁盘中,如果不改动,存储MySQL安装目录的该库的data目录下对于MyISAM存储引擎用三个文件存储数据 xx.frm(表结构文件),xx.MYD (数据文件),xx.MYI(索引文件)
索引应用:
当我们使用一条SQL语句走MyISAM索引时:第一步先从MYI的B+树结构找到data (数据所在行磁盘地址),第二步有MYD文件找到具体的数据。
2、表存储在磁盘中,如果不改动,存储MySQL安装目录的该库的data目录下对于 InnoDB 存储引擎用两个文件存储数据 xx.frm(表结构文件),xx.idb (数据文件+索引文件)
● 表数据文件本身就是按 B+Tree 组织的一个索引结构文件
● 聚集索引-叶节点包含了完整的数据记录
● 一张表只有一个聚集索引(即主键索引),其他索引都是二级索引,叶子节点的 data 中存储叶子节点的主键值,由该值进行回表操作到主键索引中查找数据,这样既能满足快速找到数据也能保证数据的一致性和节约存储空间。如果没有唯一主键,则MySQL会选择唯一列,如果没有,会自己维护一个隐藏列(如rowid)作为聚簇索引。
主键索引
二级索引
索引应用
当我们使用一条SQL语句走 InnoDB 索引时:直接从 idb 的 B+ 树结构的叶子节点中找到具体数据
使用建议
建议表必须建立一个主键,并且推荐使用整型的自增主键。
原因:
1.如果不建立主键,MySQL 会找一列所有值都不相等的列来用于构建 B+树,如果没有这样的列,MySQL 会创建一个隐藏列来维护这个B+树
2.整型比长串的占用空间更少,比较大小时相对来说更容易,能更快的定义数据的位置
3.B+Tree 需要维护自身平衡,自增不会导致树分裂
码字不易,希望各位看官支持一下呀^……^
by_啤酒烧烤