MySQL之存储引擎

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

从上图中能够看出,MySQL主要分为如下几个组件:mysql

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

1、存储引擎

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

了解: 在Oracle 和SQL Server等数据库中只有一种存储引擎,全部数据存储管理机制都是同样的。而MySql数据库提供了多种存储引擎。用户能够根据不一样的需求为数据表选择不一样的存储引擎,用户也能够根据本身的须要编写本身的存储引擎sql

下表显示了各类存储引擎的特性:数据库

MySQL存储引擎比较
特性 MyISAM InnoDB Memory Archive NDB
存储限制  没有   64TB   有  没有  没有
事务     支持      支持
锁粒度  表   行   表  行   页
B树索引  支持   支持   支持     支持
哈希索引     支持   支持    
全文索引  支持        
集群索引     支持      
数据缓存     支持    支持    
索引缓存  支持   支持    支持    
数据压缩  支持      支持  
批量插入  高  相对低   高  很是高   高
内存消耗  低  高   中  低   低
外键支持    支持      
复制支持  支持  支持   支持  支持  支持
查询缓存  支持  支持   支持  支持  支持
备份恢复  支持  支持   支持  支持  支持
集群支持          支持

其中最多见的两种存储引擎是MyISAM 和 InnoDB缓存

 MyISAM存储引擎

一、MyISAM 是MySQL (mysql 5.5版本之前) 原来的默认存储引擎.安全

二、MyISAM   这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁。网络

三、MyISAM   类型的表支持三种不一样的存储结构:静态型、动态型、压缩型。数据结构

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

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

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

  (3)压缩型:若是在这个数据库中建立的是在整个生命周期内只读的表,则这种状况就是用myisam的压缩型表来减小空间的占用。

    压缩方式参考官方文档: https://dev.mysql.com/doc/refman/5.6/en/myisampack.html

四、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

补充3点:

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

    2.大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,可是UPDATE语句在Innodb下执行的会比较的快,尤为是在并发量大的时候。

    3.两种引擎所使用的索引数据结构是什么?

        答案:都是B+树!

    MyIASM引擎,B+树的数据结构中存储的内容其实是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非汇集索引。

    Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为汇集索引。

 Memory  存储引擎

Memory存储引擎(以前称为Heap)将表中数据存放在内存中,若是数据库重启或崩溃,数据丢失,所以它很是适合存储临时数据。

Archive存储引擎

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

 NDB存储引擎

NDB存储引擎是一个集群存储引擎,相似于Oracle的RAC,但它是Share Nothing(非共享)的架构,所以能提供更高级别的高可用性和可扩展性。NDB的特色是数据所有放在内存中,所以经过主键查找很是快。

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

 

2、测试存储引擎

 建立三个表,分别使用innodb,myisam,memory 存储引擎,进行插入数据测试

1
2
3
4
5
6
7
8
9
10
create table t1(id int )engine=innodb;
create table t2(id int )engine=myisam;
create table t3(id int )engine=memory;
 
#看一下三个存储引擎建立的 表文件
  t1.frm  t1.ibd 
  t2.MYD  t2.MYI  t2.frm 
  t3.frm
#细心的同窗会发现最后的存储引擎只有表结构,无数据
#memory,在重启mysql或者重启机器后,表内数据清空

重点[面试题]:

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

相关文章
相关标签/搜索