MySQL存储引擎介绍

一 存储引擎解释

  首先肯定一点,存储引擎的概念是MySQL里面才有的,不是全部的关系型数据库都有存储引擎这个概念,后面咱们还会说,可是如今要肯定这一点。  css

  在讲清楚什么是存储引擎以前,咱们先来个比喻,咱们都知道录制一个视频文件,能够转换成不一样的格式,例如mp4,avi,wmv等,而存在咱们电脑的磁盘上也会存在于不一样类型的文件系统中如windows里常见的ntfs、fat32,存在于linux里常见的ext3,ext4,xfs,可是,给咱们或者用户看懂实际视频内容都是同样的。直观区别是,占用系统的空间大小与清晰程度可能不同。
那么数据库表里的数据存储在数据库里及磁盘上和上述的视频格式及存储磁盘文件的系统格式特征相似,也有不少种存储方式。
  可是对于用户和应用程序来讲一样一张表的数据,不管用什么引擎来存储,用户可以看到的数据是同样的。不一样储引擎存取,引擎功能,占用空间大小,读取性能等可能有区别。说白了,存储引擎就是在如何存储数据、提取数据、更新数据等技术方法的实现上,底层的实现方式不一样,那么就会呈现出不一样存储引擎有着一些本身独有的特色和功能,对应着不一样的存取机制。
  由于在关系数据库中数据的存储是以表的形式存储的,因此存储引擎也能够称为表类型(即:对表的存储、操做等的实现方法不一样),表是什么,表本质上就是磁盘上的文件。node

  其实MySQL支持多种存储引擎,每种引擎有着一些本身独特的功能,用户在使用的时候,能够根据本身的业务场景来使用不一样的存储引擎,其中MySQL最经常使用的存储引擎为:MyISAM和InnoDB。
在详细介绍这些存储引擎以前,咱们先来看看MySQL的整个工做流程,看一下存储引擎在哪里,MySQL都作了哪些事情。

  看下图:这是我在MySQL官方手册上拿下来的(手册你若是可以玩好,未来你就能作一个NB的DBA~~~)

​       img

  英文版的看着很难受啊超哥,好好好,给你来个中文的,看下图:mysql

      img

  来,看每一个部分的解释,看下图:linux

      img

  搞明白整个过程以后,咱们来细说一下这些存储引擎,看下一节~~~sql

    

二 MySQL存储引擎分类

  前面咱们对MySQL进行操做的时候并无指定存储引擎,为何还能用呢,没有指定还能用,说明什么,说明MySQL默认有一个存储引擎,我记得MySQL5.5以前,默认的存储引擎是MyISAM,以后都改成InnoDB了,咱们的重点就是这个InnoDB,也是公司中最经常使用的、最好用的引擎,可是仍是一些公司在用MyISAM引擎,除了历史缘由以外,还有MyISAM的效率比InnoDB高一点,InnoDB在这方面作了不少优化,效率已经和MyISAM差很少了,可是InnoDB引擎还有好多其余的NB的功能,下面咱们就介绍几种存储引擎。数据库

  首先看一下我们的默认存储引擎:vim

  img

  

  不一样的引擎表明着不一样的存取机制,那么有哪些引擎呢,链接进入mysql以后,查看MySQL支持的全部存储引擎:windows

    一、show engines;#查看MySQL全部的引擎,缓存

      img

    二、show variables like "storage_engine%";查看当前正在使用的引擎安全

      img

    注意:在存储大文件的时候,能够存到数据库,可是尽可能别直接存到数据库里面,会影响数据库的效率,咱们就存文件的路径、地址,用户想要这个大文件,咱们能够到对应的路径下取读取这个文件给用户。

  

  几种经常使用引擎介绍

      1. MyISAM引擎  

MyISAM引擎特色:
        1.不支持事务
            事务是指逻辑上的一组操做,组成这组操做的各个单元,要么全成功要么全失败。
        2.表级锁定
            数据更新时锁定整个表:其锁定机制是表级锁定,也就是对表中的一个数据进行操做都会将这个表锁定,其余人不能操做这个表,这虽然可让锁定的实现成本很小可是也同时大大下降了其并发性能。
        3.读写互相阻塞
            不只会在写入的时候阻塞读取,MyISAM还会再读取的时候阻塞写入,但读自己并不会阻塞另外的读。
        4.只会缓存索引
            MyISAM能够经过key_buffer_size的值来提升缓存索引,以大大提升访问性能减小磁盘IO,可是这个缓存区只会缓存索引,而不会缓存数据。
        
        5.读取速度较快
            占用资源相对较少
        6.不支持外键约束,但只是全文索引
        7.MyISAM引擎是MySQL5.5版本以前的默认引擎,是对最初的ISAM引擎优化的产物。
MyISAM引擎适用的生产业务场景
        1.不须要事务支持的业务(例如转帐就不行,充值也不行)
        2.通常为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合。
        3.读写并发访问都相对较低的业务(纯读纯写高并发也能够)(锁定机制问题)
        4.数据修改相对较少的业务(阻塞问题)
        5.以读为主的业务,例如:www.blog,图片信息数据库,用户数据库,商品库等业务
        6.对数据一致性要求不是很高的业务。
        7.中小型的网站部分业务会用。
        小结:单一对数据库的操做均可以示用MyISAM,所谓单一就是尽可能纯读,或纯写(insert,update,delete)等。
MyISAM引擎调优精要
        1.设置合适的索引(缓存机制)(where、join后面的列创建索引,重复值比较少的建索引等)
        2.调整读写优先级,根据实际需求确保重要操做更优先执行,读写的时候能够经过参数设置优先级。
        3.启用延迟插入改善大批量写入性能(下降写入频率,尽量多条数据一次性写入)。
        4.尽可能顺序操做让insert数据都写入到尾部,较少阻塞。
        5.分解大的操做,下降单个操做的阻塞时间,就像操做系统控制cpu分片同样。
        6.下降并发数(减小对MySQL访问),某些高并发场景经过应用进行排队队列机制Q队列。
        7.对于相对静态(更改不频繁)的数据库数据,充分利用Query Cache(能够经过配置文件配置)或memcached缓存服务能够极大的提升访问频率。
        8.MyISAM的Count只有在全表扫描的时候特别高效,带有其余条件的count都须要进行实际的数据访问。
        9.能够把主从同步的主库使用innodb,从库使用MyISAM引擎。主库写,从库读能够(不推荐,有些麻烦的地方,市场上有人这么用)。
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本以前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不一样在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在全部的应用中是否都须要事务呢?在数据仓库中,若是没有 ETL 这些操做,只是简单地经过报表查询还须要事务的支持吗?此外,MyISAM 存储引擎的 另外一个不同凡响的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。

      2. InnoDB引擎

InnoDB引擎
        介绍:InnoDB引擎是MySQL数据库的另外一个重要的存储引擎,正称为目前MySQL AB所发行新版的标准,被包含在全部二进制安装包里。和其余的存储引擎相比,InnoDB引擎的优势是支持兼容ACID的事务(相似于PostGreSQL),以及参数完整性(即对外键的支持)。Oracle公司与2005年10月收购了Innobase。Innobase采用双认证受权。它使用GNU发行,也容许其余想将InnoDB结合到商业软件的团体得到受权。

InnoDB引擎特色:
        1.支持事务:支持4个事务隔离界别,支持多版本读。
        2.行级锁定(更新时通常是锁定当前行):经过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。
        3.读写阻塞与事务隔离级别相关(有多个级别,这就不介绍啦~)。
        4.具体很是高效的缓存特性:能缓存索引,也能缓存数据。
        5.整个表和主键与Cluster方式存储,组成一颗平衡树。(了解)
        6.全部SecondaryIndex都会保存主键信息。(了解)
        7.支持分区,表空间,相似oracle数据库。
        8.支持外键约束,不支持全文索引(5.5以前),之后的都支持了。
        9.和MyISAM引擎比较,InnoDB对硬件资源要求仍是比较高的。
        
        小结:三个重要功能:Supports transactions,row-level locking,and foreign keys
InnoDB引擎适用的生产业务场景
        1.须要事务支持(具备较好的事务特性,例银行业务)
        2.行级锁定对高并发有很好的适应能力,但须要确保查询是经过索引完成。
        3.数据更新较为频繁的场景,如:BBS(论坛)、SNS(社交平台)、微博等
    
        4.数据一致性要求较高的业务,例如:充值转帐,银行卡转帐。
        5.硬件设备内存较大,能够利用InnoDB较好的缓存能力来提升内存利用率,尽量减小磁盘IO,能够经过一些参数来设置,这个就不细讲啦~~~
        
        6.相比MyISAM引擎,Innodb引擎更消耗资源,速度没有MyISAM引擎快
InnoDB引擎调优精要
        1.主键尽量小,避免给Secondery index带来过大的空间负担。
        2.避免全表扫描,由于会使用表锁。
        3.尽量缓存全部的索引和数据,提升响应速度,较少磁盘IO消耗。
        4.在大批量小插入的时候,尽可能本身控制事务而不要使用autocommit自动提交,有开关能够控制提交方式。
        5合理设置innodb_flush_log_at_trx_commit参数值,不要过分追求安全性。
        若是innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不作任何操做。
        6.避免主键更新,由于这会带来大量的数据移动。
        
        能够看一看InnoDB的重要参数学习一下。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒同样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,能够将每一个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于创建其表空间。
InnoDB 经过使用多版本并发控制(MVCC)来得到高并发性,而且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此以外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了汇集(clustered)的方式,每张表都是按 主键的顺序进行存储的,若是没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此做为主键。
InnoDB 存储引擎是 MySQL 数据库最为经常使用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证实了 InnoDB 存储引擎具有高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也须要时间和技术的积累。若是想深刻了解 InnoDB 存储引擎的工做 原理、实现和应用,能够参考《MySQL 技术内幕:InnoDB 存储引擎》一书。

      总说事务,到底啥事事务?咱们看看解释:

事务介绍:
        简单地说,事务就是指逻辑上的一组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)
            一个事务一旦被提交,它对数据库中的数据改变就是永久性的。若是出了错误,事务也不允撤销,只能经过'补偿性事务'。
        
    事务的开启:
        数据库默认事务是自动提交的,也就是发一条sql他就执行一条。若是想多条sql放在一个事务中执行,则须要使用事务进行处理。当咱们开启一个事务,而且没有提交,mysql会自动回滚事务。或者咱们使用rollback命令手动回滚事务。
        数据库开启事务的命令,咱们后面会讲到~~~

      

      在介绍上面两个引擎中涉及的两个概念(OLTP和OLAP)的介绍

      参考文章:https://blog.csdn.net/zhangzheng0413/article/details/8271322/

        

      **3.其余引擎的介绍

#NDB 存储引擎
2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,相似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不一样的是,其结构是 share nothing 的集群架构,所以能提供更高级别的 高可用性。NDB 存储引擎的特色是数据所有放在内存中(从 5.1 版本开始,能够将非索引数 据放在磁盘上),所以主键查找(primary key lookups)的速度极快,而且可以在线添加 NDB 数据存储节点(data node)以便线性地提升数据库性能。因而可知,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。

#Memory 存储引擎
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它很是适合于存储 OLTP 数据库应用中临时数据的临时表,也能够做为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是一般熟悉的 B+ 树索引。

#Infobright 存储引擎
第三方的存储引擎。其特色是存储是按照列而非行的,所以很是 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有很多成功的数据 仓库案例可供分析。

#NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的未来会实现面向内存的事务支持。

#BLACKHOLE
黑洞存储引擎,能够应用于主备复制中的分发主库。

MySQL 数据库还有不少其余存储引擎,上述只是列举了最为经常使用的一些引擎。若是 你喜欢,彻底能够编写专属于本身的引擎,这就是开源赋予咱们的能力,也是开源的魅 力所在。

三 存储引擎的使用

  一、建立表时指定引擎

create table innodb_t2(id int)engine=innodb;

  二、在配置文件中指定默认的存储引擎

linux:vim /etc/my.cnf   windows:my.ini文件
[mysqld]
default-storage-engine=INNODB  #配置默认引擎,如今用的mysql默认基本都是InnoDB,因此其实均可以不用配置了
innodb_file_per_table=1  #表示独立表空间存储,能够不写

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

    建立四个表,分别使用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;

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

    img

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

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人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。

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

  Oracle中不存在引擎的概念,数据处理大体能够分红两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、平常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操做,侧重决策支持,而且提供直观易懂的查询结果。

关于MySQL的存储引擎大概就说这么多吧有兴趣或者有基础的同窗,能够多去学一下MySQL官方手册..收获会有不少那么咱们就继续回到咱们的数据表操做去学习吧

相关文章
相关标签/搜索