数据库存储引擎

mysql存储引擎概述

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

SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每一个数据库中都存在,但不是每 个数据库都有这么多存储引擎。MySQL 的插件式存储引擎可让存储引擎层的开发人员设 计他们但愿的存储层,例如,有的应用须要知足事务的要求,有的应用则不须要对事务有这 么强的要求 ;有的但愿数据能持久存储,有的只但愿放在内存中,临时并快速地提供对数据 的查询。 sql

一种类型代表的是一种存储方式
存储引擎:就是表的类型,不一样的类型就会对应不一样的处理机制去处理他
事务:就是要么同时成功,要么同时不成功数据库

mysql支持哪些存储引擎?

mysql5.6支持的存储引擎包括InnoDB、MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED、MRG_MYISAM、ARCHIVE、PERFORMANCE_SCHEMA。缓存

其中NDB和InnoDB提供事务安全表,其余存储引擎都是非事务安全表。安全

各类存储引擎的特性

InnoDB服务器

MySql 5.6 版本默认的存储引擎。InnoDB 是一个事务安全的存储引擎,它具有提交、回滚以及崩溃恢复的功能以保护用户数据。InnoDB 的行级别锁定以及 Oracle 风格的一致性无锁读提高了它的多用户并发数以及性能。InnoDB 将用户数据存储在汇集索引中以减小基于主键的普通查询所带来的 I/O 开销。为了保证数据的完整性,InnoDB 还支持外键约束。网络

MyISAM架构

MyISAM既不支持事务、也不支持外键、其优点是访问速度快,可是表级别的锁定限制了它在读写负载方面的性能,所以它常常应用于只读或者以读为主的数据场景。并发

Memory函数

在内存中存储全部数据,应用于对非关键数据由快速查找的场景。Memory类型的表访问数据很是快,由于它的数据是存放在内存中的,而且默认使用HASH索引,可是一旦服务关闭,表中的数据就会丢失

BLACKHOLE

黑洞存储引擎,相似于 Unix 的 /dev/null,Archive 只接收但却并不保存数据。对这种引擎的表的查询经常返回一个空集。这种表能够应用于 DML 语句须要发送到从服务器,但主服务器并不会保留这种数据的备份的主从配置中。

事务

        简单地说,事务就是指逻辑上的一组SQL语句操做,组成这组操做的各个SQL语句,执行时要么全成功要么全失败。
        例如:你给我转帐5块钱,流程以下
            a.从你银行卡取出5块钱,剩余计算money-5
            b.把上面5块钱打入个人帐户上,我收到5块,剩余计算money+5.
        上述转帐的过程,对应的sql语句为:
                update 你_account set money=money-5 where name='你';
                update 我_account set money=money+5 where name='我';
        上述的两条SQL操做,在事务中的操做就是要么都执行,要么都不执行,否则钱就对不上了。
        这就是事务的原子性(Atomicity)。
    事务的四大特性:
 1.原子性(Atomicity)
            事务是一个不可分割的单位,事务中的全部SQL等操做要么都发生,要么都不发生。
 2.一致性(Consistency)
            事务发生前和发生后,数据的完整性必须保持一致。
 3.隔离性(Isolation)
            当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其余的会话是不可见的,多个并发事务之间的数据是相互隔离的。也就是其余人的操做在这个事务的执行过程当中是看不到这个事务的执行结果的,也就是他们拿到的是这个事务执行以前的内容,等这个事务执行完才能拿到新的数据。
 4.持久性(Durability)
            一个事务一旦被提交,它对数据库中的数据改变就是永久性的。若是出了错误,事务也不允撤销,只能经过'补偿性事务'。

经常使用存储引擎及适用场景

InnoDB

用于事务处理应用程序,支持外键和行级锁。若是应用对事物的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操做除了插入和查询以外,还包括不少更新和删除操做,那么InnoDB存储引擎是比较合适的。InnoDB除了有效的下降由删除和更新致使的锁定,还能够确保事务的完整提交和回滚,对于相似计费系统或者财务系统等对数据准确要求性比较高的系统都是合适的选择。

MyISAM

若是应用是以读操做和插入操做为主,只有不多的更新和删除操做,而且对事务的完整性、并发性要求不高,那么能够选择这个存储引擎。

Memory

将全部的数据保存在内存中,在须要快速定位记录和其余相似数据的环境下,能够提供极快的访问。Memory的缺陷是对表的大小有限制,虽然数据库由于异常终止的话数据能够正常恢复,可是一旦数据库关闭,存储在内存中的数据都会丢失。

存储引擎在mysql中的使用

查看当前的默认存储引擎:

mysql> show variables like "default_storage_engine";

查询当前数据库支持的存储引擎

mysql> show engines \G;

指定存储引擎建表

在建表时指定

mysql> create table ai(id bigint(12),name varchar(200)) ENGINE=MyISAM;

mysql> create table country(id int(4),cname varchar(50)) ENGINE=InnoDB;

也可使用alter table语句,修改一个已经存在的表的存储引擎。

mysql> alter table ai engine = innodb;

在配置文件中指定

#my.ini文件

[mysqld]

default-storage-engine=INNODB

不一样引擎在建立表的时候生成文件的不一样

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

#下面是使用四个不一样的引擎来建立的表
create table t1(id int)engine=innodb; create table t2(id int)engine=myisam; create table t3(id int)engine=memory; create table t4(id int)engine=blackhole;

经过四种引擎来建立的表,咱们对照着其生成的文件来看一下区别,看下图:

    

 

 关于上面的文件做用介绍:

1.db.opt文件:用来记录该库的默认字符集编码和字符集排序规则用的。也就是说若是你建立数据库指定默认字符集和排序规则,那么后续建立的表若是没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
2.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息
3.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
4.后缀名为.MYD(MYData)的文件:从名字能够看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
5.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
6.ibdata1文件:主要做用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
 从上面能够看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢? 
    主要区别是再于数据库的存储引擎不同,若是储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎若是是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,若是采用共存储模式的,数据信息和索引信息都存储在ibdata1(在里面进行分类,从外面看是一个文件)中; 
    在进行数据恢复的时候,若是用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去便可。可是若是是innodb的话,则每个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才能够。
msyql人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。

mysql的工做流程

MySQL架构总共四层,在上图中以虚线做为划分。 
  首先,最上层的服务并非MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有相似的架构。好比:链接处理、受权认证、安全等。 
  第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及全部的内置函数(例如:日期、时间、数学和加密函数)。同时,全部的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

  第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器经过API和存储引擎进行通讯。这些接口屏蔽了不一样存储引擎之间的差别,使得这些差别对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操做。但存储引擎通常不会去解析SQL(InnoDB会解析外键定义,由于其自己没有实现该功能),不一样存储引擎之间也不会相互通讯,而只是简单的响应上层的服务器请求。

  第四层包含了文件系统,全部的表结构和数据以及用户操做的日志最终仍是以文件的形式存储在硬盘上。