MySQL存储引擎

MySQL数据库的体系架构如下图所示:

从上图中可以看出,MySQL主要分为以下几个组件:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 分析器组件
  • 优化器组件
  • 缓冲组件
  • 插件式存储引擎
  • 物理文件

存储引擎:其实就是指定如何存储数据,如何为存储的数据建立索引以及如何更新、查询数据等技术实现的方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

在Oracle和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

下面来看看各种存储引擎的比较:

其中最常见的两种存储引擎是MyISAMInnoDB

 MyISAM存储引擎 

1.MyISAM是MySQL(mysql 5.5版本以前)原来的默认存储引擎;

2.MyISAM存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁;

3.MyISAM类型的表支持三种不同的存储结构:静态型、动态型、压缩型;

  静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),
      这样mysql就会自动使用静态myisam格式;

      使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开
      销很低。但是这高性能是用空间换来的,因为在定义的时候是固定的,所以不管列中的值有
      多大,都会以最大值为准,占据了整个空间。

  动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam
      就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低。

  压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压
      缩型表来减少空间的占用。

4.MyISAM也是使用B+tree索引但是和Innodb的在具体实现上有些不同。

 InnoDB存储引擎 

1.MySQL默认存储引擎(MySQL 5.5 版本后);

2.innodb 支持事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全;

3.innodb 支持自增长列(auto_increment),自增长列的值不能为空,(一个表只允许存在一个自增,并且要求自增列必须为索引);

4.innodb 支持外键(foreign key),外键所在的表称为子表,而所依赖的表称为父表;

5.innodb存储引擎支持行级锁;

6.innodb存储引擎索引使用的是B+tree。

补充三点:

①大容量的数据集时趋向于选择Innodb,因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

②大批量的插入语句时(这里是insert语句)在MyIASM引擎中执行的比较的快,但是update语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

③两种引擎所使用的索引数据结构是什么?
  答案:都是 B+tree
MyIASM引擎,B+tree的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引
Innodb引擎的索引的数据结构也是B+tree,只不过数据结构中存储的都是实际的数据,这种索引被称为聚集索引

 Memory存储引擎 

Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

 Archive存储引擎 

正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持 insert 和 select 操作,其设计的主要目的是提供高速的插入和压缩功能。

 NDB存储引擎 

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing(非共享)的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点是数据全部放在内存中,因此通过主键查找非常快。

关于NDB,有一个问题需要注意,它的连接 join 操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,查询速度会很慢。

 重点:面试题 

innodb与MyIASM存储引擎的区别:
1.innodb 是MySQL 5.5版本 以后的默认存储引擎,而MyISAM是 5.5版本 以前的默认存储引擎;
2.innodb 支持事物,而MyISAM不支持事物;
3.innodb 支持行级锁,而 MyIASM 它支持的是并发的表级锁;
4.innodb 支持外键,而MyIASM 不支持外键;
5.innodb 与 MyIASM 存储引擎都采用 B+tree 存储数据,但是innodb的索引与数据存储在一个文件中,这种方式我们称之为聚合索引。而MyIASM则会单独创建一个索引文件,也就是说,数据与索引是分离开的;
6.在效率方面 MyISAM 比 innodb 高,但是在性能方面 innodb 要好一点。

原文地址:https://www.cnblogs.com/believepd/p/9829983.html