数据库引擎比较详解--MyISAM与InnoDB

 MyISAM:

  • 1.MyISAM索引(非聚集索引):MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。索引和数据是分开的,并且索引是有压缩的。

这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的。

  • 2. MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,也不支持外键
  • 3. MyISAM 是表级锁不会出现死锁问题
  • 4. MyISAM保存表的全部行数
  • 5. MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储直接复制。

 

InnoDB:

  • 1.  InnoDB索引实现(聚集索引):InnoDB也使用B+Tree作为索引结构。但是InnoDB的数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键

InnoDB的辅助索引data域存储相应记录主键的值而不是地址,聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大


  • 2.Innodb 支持事务处理:事务支持commit,rollback和crashrecovery,从而保护用户数
  • 3.基于行锁以及类似oracle的一致性读:提升了多用户的并发和性能
  • 4. InnoDB也支持外键。如果使用了外键,insert,update以及delete操作都会得到检查,以确保不会导致多表之间的数据不一致。
  • 5. InnoDB存储引擎维护了它自己的bufferpool(缓冲池),用来在内存中缓存数据和索引。经常使用的数据直接从内存中进行处理以便加快处理速度。
  • 6. InnoDB支持crash recovery(崩溃修复),以便在数据库出现故障的时候,可以直接进行重启即可,数据不会丢失。在恢复的时候,可以提交已经commit的请求,回滚任何还未commit的请求。
  • 7. InnoDB 中不保存表的具体行数也就是说,执行selectcount(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是当count(*)语句包含 where条件时,两种引擎的操作是一样的。


聚集索引与非聚集索引:

  • 聚集索引:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
  • 非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
  • 按照定义,除了聚集索引以外的索引都是非聚集索引
  • 非聚集索引:分成普通索引,唯一索引,全文索引。非聚集索引就像新华字典的偏旁字典,结构顺序与实际存放顺序不一定一致。


MVCC:多版本并发控制

先理解并发和并行的区别

  • 并发的关键是你有处理多个任务的能力,不一定要同时。
  • 并行的关键是你有同时处理多个任务的能力。
  • 所以它们最关键的点就是 是否『同时』。

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.

SELECT

InnoDB会根据以下两个条件检查每行记录:
a.InnoDB只会查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的.
b.行的删除版本要么未定义,要么大于当前事务版本号,这可以确保事务读取到的行,在事务开始之前未被删除.
只有a,b同时满足的记录,才能返回作为查询结果.

DELETE

InnoDB会为删除的每一行保存当前系统的版本号(事务的ID)作为删除标识.





  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值