Innodb和MyIsam的区别
(1)对事务的⽀持不同
MyIsam不⽀持事务,⽽InnoDB⽀持事务。
(2)锁的级别⽀持不同
MyIsam只能⽀持表锁,⽽InnoDB能够⽀持⾏锁。
(3)全⽂索引的⽀持不同
MyIsam⽀持全⽂索引,⽽InnoDB不⽀持,⼀般加上sphinx组合⽀持
(4)索引实现⽅式不同
索引的数据结构均为B+树,MyIsam的索引为非聚簇索引,Innodb为聚簇索引
MyIsam的索引实现方式
MyIsam为非聚簇索引,索引与数据文件分别存储,索引存放在XX.MYI(MyIsam.index)⽂件,⽽数据存放在XX.MYD(MyIsam.data)⽂件中。
主索引:
在B+树的叶子节点存储key为唯一值
,data数据为物理地址
辅助索引:
在B+树的叶子节点存储
key不必是唯一值
,data数据为物理地址image.png
MyISAM索引检索的算法B+Tree搜索算法搜索索引,如果指定的Key存在,则取出data数据的物理地址,然后根据物理地址读取数据。
Innodb的索引实现方式
MyIsam为聚簇索引,只有一个数据文件(XX.IDB),数据文件本身即是B+树的数据结构。
主索引:
在B+树的叶子节点key为主键,data数据为表数据
辅助索引:
在B+树的叶子节点key为主键,data数据为主键数据
image.png
辅助索引查询时需要先查询出主键值,然后根据主键值找行数据
例外是覆盖索引(查询字段与查询使用索引包含字段相同)
覆盖索引只需访问索引⽂件,不需要回表调取数据,查找效率更⾼
为何?
因为对于 InnoDB 而言,索引存放的是所有字段的值,索引的data数据即包含需查询所有结果
InnoDB的数据文件本身要按主键聚集,因此InnoDB表必须包含主键。
如果没有指定主键,自动选择唯一列作为主键
没有唯一列,选择内置的ROWID作为主键
自动选择唯一列作为主键弊端
如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。
是因为唯一索引不是递增关系,在插入索引节点时,可能会在B+树的中间插入,会有导致B+树的频繁调整。
网友评论