MySQL引擎的和区别

转载自https://m.nowcoder.com/tutorial/93/8ac75a692a3b4b0a868796b9f008bc2c

MySQL引擎

MySQL中的数据用各种不同的技术存储在文件(或内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧和锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或功能,从而改善你的应用的总体功能。

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。

MySQL存储引擎主要有:MyISAM、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archieve、Federated、Mrg_Myiasm.

但是最常用的是InnoDB和MyISAM。

InnoDB

InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。

  • InnoDB引擎提供了对数据库ACID事务的支持,并且实现了SQL的四种隔离级别。
  • 该引擎还提供了行级锁定和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。
  • 但是该引擎不支持FULLTEXT类型的索引
  • 而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE需要扫描全表
  • 当需要使用数据库事务时,该引擎是首选。
  • 由于锁的粒度更小,写操作不会锁定全表,所以在高并发时,使用InnoDB会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB同样会锁定全表

适用场景:

  • 经常更新的表,适合多并发的更新请求
  • 支持事务
  • 可以从灾难中恢复(通过bin-log日志等)
  • 外键越苏。只有它支持外键
  • 支持自动增加列属性auto_increment

索引结构:

InnoDB也是B+树的索引结构。InnoDB的索引文件本身就是数据文件,即B+Tree的数据域存储的就是实际的数据,这种索引就是聚集索引。这个索引的key就是数据库的主键,因此InnoDB表数据文件本身就是主索引。

InnoDB的辅助索引数据与存储的也是相应记录主键的值而不是地址,所以当用辅助索引查找时,会先根据辅助索引找到主键,再根据主键找到实际的数据。所以InnoDB不建议使用过长的主键,否则会使辅助索引变得很大。建议使用自增的字段作为主键,这样B+tree的每个节点都会被顺序的填满,而不会频繁的分裂调整,会有效提升插入数据的效率。

MyISAM

MyISAM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT或UPDATE数据时(即写操作)需要锁定全表,效率会比较低。MyISAM存储引擎独立于操作系统,也可以在windows上使用,也可以简单的将数据转移到linux操作系统上。

使用场景:

  • 不支持事务的设计,但是并不代表者有事务操作的项目不能使用MyISAM存储引擎,可以在service层根据自己的业务需求进行相应的控制
  • 不支持外键
  • 查询速度很快,MyISAM极度强调快读读取操作
  • 整天对表加锁的场景
  • MyISAM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取保存号的值而不需要扫面全表。
  • 如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyISAM也是很好的选择
  • 缺点:不能在表损坏后主动恢复数据

索引结构:

MyISAM索引用的B+tree来存储数据,MyIASM索引的指针指向的是键值的地址,地址存储的是数据。B+tree的数据域存储的内容为实际数据的地址,也就是说它的索引和实际数据是分开的,这种索引就是所谓的非聚集索引。

InnoDB和MyISAM的区别

1)事务:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持,提供事务支持已经外部键等高级数据库功能。

2)性能:MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快。

3)行数保存:InnoDB 中不保存表的具体行数,也就是说,执行select count() fromtable时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时,两种表的操作是一样的。

4)索引存储:对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。MyISAM支持全文索引(FULLTEXT)、压缩索引,InnoDB不支持。

MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。

5)服务器数据备份:InnoDB必须导出SQL来备份,LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

MyISAM应对错误编码导致的数据恢复速度快。MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

6)锁的支持:MyISAM只支持表锁。InnoDB支持表锁、行锁 行锁大幅度提高了多用户并发操作的性能但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的

posted @ 2020-03-27 11:39  Rogn  阅读(409)  评论(0编辑  收藏  举报