(转)Mysql数据库存储引擎

 

什么是MySql数据库mysql

    一般意义上,数据库也就是数据的集合,具体到计算机上数据库能够是存储器上一些文件的集合或者一些内存数据的集合。
    咱们一般说的MySql数据库,sql server数据库等等实际上是数据库管理系统,它们能够存储数据,并提供查询和更新数据库中的数据的功能等等。根据数据库如何存储数据和如何操做数据的实现机制不一样,这些数据库之间即有区别又有共同点。
    MySql数据库是开放源代码的关系型数据库。目前,它能够提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。在后期,咱们会详细讲解这些功能。
    同Oracle 和SQL Server等大型数据库系统同样,MySql也是客户/服务器系统而且是单进程多线程架构的数据库。
    MySql区别于其它数据库系统的一个重要特色是支持插入式存储引擎。

那么什么是存储引擎呢?(重要)sql

    存储引擎说白了就是如何存储数据、如何为存储的数据创建索引和如何更新、查询数据等技术的实现方法。由于在关系数据库中数据的存储是以表的形式存储的,因此存储引擎也能够称为表类型(即存储和操做此表的类型)。
    在Oracle 和SQL Server等数据库中只有一种存储引擎,全部数据存储管理机制都是同样的。 而MySql数据库提供了多种存储引擎。用户能够根据不一样的需求为数据表选择不一样的存储引擎,用户也能够根据本身的须要编写本身的存储引擎。
MySql中有哪些存储引擎?
 
    1MyISAM:这种引擎是mysql最先提供的。这种引擎又能够分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
    静态MyISAM:若是数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。由于数据表中每一条记录所占用的空间都是同样的,因此这种表存取和更新的效率很是高。当数据受损时,恢复工做也比较容易作。
    动态MyISAM:若是数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但因为每条记录的长度不一,因此屡次修改数据后,数据表中的数据就可能离散的存储在内存中,进而致使执行效率降低。同时,内存中也可能会出现不少碎片。所以,这种类型的表要常常用optimize table 命令或优化工具来进行碎片整理。
    压缩MyISAM:以上说到的两种类型的表均可以用myisamchk工具压缩。这种类型的表进一步减少了占用的存储,可是这种表压缩以后不能再被修改。另外,由于是压缩数据,因此这种表在读取的时候要先时行解压缩。
    可是,无论是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。
    2 MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。
   3 InnoDB: InnoDB表类型能够看做是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
   4 memory(heap): 这种类型的数据表只存在于内存中。它使用散列索引,因此数据的存取速度很是快。 由于是存在于内存中,因此这种类型常应用于临时表中。
   5 archive: 这种类型只支持select 和 insert语句,并且不支持索引。常应用于日志记录和聚合分析方面。
   固然MySql支持的表类型不止上面几种。

   下面咱们介绍一下如何查看和设置数据表类型。 数据库

MySql中关于存储引擎的操做缓存

   1 查看数据库能够支持的存储引擎
   用show engines; 命令能够显示当前数据库支持的存储引擎状况,如图1所示:安全

                                            图1 数据库的存储引擎bash


   由上图可见当前系统的默认数据表类型是MyISAM。固然,咱们能够经过修改数据库配置文件中的选项,设定默认表类型。
   2 查看表的结构等信息的若干命令
   要查看表的定义结构等信息可使用如下几种命令:
   2.1Desc[ribe] tablename; //查看数据表的结构
   例如,查看表t1的结构,可得下图。服务器

                                        图2:查看表t1的结构
 
   2.2 Show create table tablename; //显示表的建立语句
   同上查询表t1,得下图:数据结构

                                          图3 显示建立表t1的语句多线程

 
   2.3 show table status like ‘tablename’\G显示表的当前状态值架构

    同上查询表t1,得下图:

                   图4 显示表t1 的当前状态值

 
   综上可见,后两种方式均可以帮助咱们查看某一表的存储引擎类型(图中已用红色方框标出)。
   3  设置或修改表的存储引擎
   3.1建立数据库表时设置存储存储引擎的基本语法是:
Create table tableName(
columnName(列名1)  type(数据类型)  attri(属性设置),
columnName(列名2)  type(数据类型)  attri(属性设置),
……..) engine = engineName

例如,假设要建立一个名为user的表,此表包括id,用户名username和性别sex三个字段,而且要设置表类型为merge。则可用以下的方式建立此数据表,

create table user(

  id int not null auto_increment,

  username char(20) not null,

  sex char(2),

  primary key(id)

) engine=merge

具体执行结果见下图:

            图5 建立表user 

                                                                                                                                                                                                                                       

查看建立后表user的信息,可见表的当前存储引擎是merge,如图所示:

             图6 显示表t1 的当前状态值

 

   3.2修改存储引擎,能够用命令Alter table tableName engine =engineName

假如,若须要将表user的存储引擎修改成archive类型,则可以使用命令alter table user engine=archive。以下图所示:

             图7 修改表user的存储引擎

 
查看修改后的表类型,可见表类型已经变为archive类型。

             图8 显示表user修改后的状态值
 
小结
     在本文中主要介绍了什么是MySql数据库,并进一步引出了它的一个重要特性, 即插入式的多存储引擎机制。而后,简单介绍了什么是存储引擎和MySql中几种主要的存储引擎。最后,介绍了如何查看数据库支持的全部存储引擎,如何查看数据库表的存储引擎类型及如何设置或修改表的存储引擎类型。刚刚入门学习MySql,文中有错误之处,还请你们多多指导!

 

 

补充资料:


简单介绍

存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。存储引擎的概念是MySQl的特色,并且是一个插入式的存储引擎概念。这就决定了MySQl数据库中的表可使用不一样的存储方式存储。用户能够根据本身的不一样要求,选择不一样的存储方式、是否进行事务处理等。


查询方式及内容解析

使用SHOW ENGINES语句能够查看MySQL数据库支持的存储引擎类型。查询方法以下:

1
SHOW ENGINES;

SHOW ENGUNES语句可使用“;”结束,也可使用“\g”或者“\G”结束。“\g”与“;”的做用相同,“\G”可让结果显示的更加美观。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
       Engine: MRG_MYISAM
      Support: YES
      Comment: Collection of identical MyISAM tables
Transactions: NO
           XA: NO
   Savepoints: NO
*************************** 2. row ***************************
       Engine: InnoDB
      Support: DEFAULT
      Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
           XA: YES
   Savepoints: YES
*************************** 3. row ***************************
       Engine: MyISAM
      Support: YES
      Comment: MyISAM storage engine
Transactions: NO
           XA: NO
   Savepoints: NO
###############中间已省略###################
*************************** 8. row ***************************
       Engine: MEMORY
      Support: YES
      Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
           XA: NO
   Savepoints: NO
8 rows in set (0.11 sec)

解析:查询结果中,Engine参数指存储引擎名称;Support参数说明MySQL是否支持该类引擎,YES表示支持;Comment参数指对该引擎的评论;Transactions 参数表示是否支持事务处理,YES表示支持;XA参数表示是否分布式交易处理XA规范,YES表示支持;Savepoints参数表示是否支持保存点,以便事务回滚到保存点,YES表示支持。

从查询结果中能够看出,MySQL支持的引擎参数包括MyISAM、MEMORY、InnoDB、ARCHIVE和MRG_MYISAM等。其中InnoDB为默认的存储引擎。可以使用语句查询默认的存储引擎此代码以下:

 

1
SHOW VARIABLES LIKE 'storage_engine' ;

代码执行的结果以下:

1
2
3
4
5
6
7
mysql> SHOW VARIABLES LIKE 'storage_engine' ;
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
1 row in set (0.10 sec)

解析:结果显示默认的存储引擎为InnoDB。若是想修改默认的存储引擎能够在配置文件my.ini中修改。将”default-storage-engine=InnoDB”更改成”default-storage-engine=MyISAM”。而后重启服务,修改生效。

使用SHOW TABLESTATUS能够查看某个库中全部表支持的存储引擎类型查询方法以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> USE hellodb
Database changed
mysql> SHOW TABLE STATUS\G
*************************** 7. row ***************************
            Name: toc
          Engine: MyISAM
         Version: 10
      Row_format: Fixed
            Rows: 0
  Avg_row_length: 0
     Data_length: 0
Max_data_length: 2533274790395903
    Index_length: 1024
       Data_free: 0
  Auto_increment: 1
     Create_time: 2013-08-12 16:17:23
     Update_time: 2013-08-12 16:17:23
      Check_time: NULL
       Collation: utf8_general_ci
        Checksum: NULL
  Create_options:
         Comment:

解析:结果显示对于MySQL来讲全部表默认都是使用MyISAM存储引擎,其中Name:表名;Engine:使用的存储引擎;Version:所用存储引擎的版本;Row_format:行格式,对于MyISAM存储引擎来讲常见的有Dynamic(变长记录), Fixed(定长记录), Compressed(压缩之后存放的行), compact(InnoDB中常见的);Rows: 表中的行数(对于其余存储引擎来讲这个值是估算的);Avg_row_length: 行的平均字节数;Data_length:表的数据量,单位为字节;Max_data_length:表的容量上限(不一样的存储引擎容量上限不一样);Index_length:索引数据量,单位字节;Data_free:已经分配出去,但未存储数据的存储空间;Auto_increment:具备自动增加属性的字段上,下一个自动增加的值;Create_time:表的建立时间;Update_time: 数据最近一次的更新时间;Check_time: 使用CHECK命令最近一次检查表的时间;myisamchk; Checksum: 表的校验和;Create_options:建立表时指定的其它选项;Comment: 对于MyISAM表,存储的是建立表时的comment表选项指定的信息;对InnoDB表来说,存储对应的表空间剩余的表空间信息。


各类存储引擎特性比较:

在实际工做中,选择一个合适的存储引擎是一个很复杂的问题。每种存储引擎都有各自的优点,不能笼统的说谁比谁更好。下面将详解不一样环境常常用到的存储引擎和针对各个存储引擎的特色进行对比,给出不一样的选择建议。

  • InnoDB存储引擎

InnoDB是Mysql数据库的一种存储引擎。InnoDB给Mysql的表提供了 事务、回滚、崩溃修复能力、多版本并发控制的事务安全、间隙锁(能够有效的防止幻读的出现)、支持辅助索引、聚簇索引、自适应hash索引、支持热备、行级锁。还有InnoDB是Mysql上惟一一个提供了外键约束的引擎。

InnoDB存储引擎中,建立的表的表结构是单独存储的而且存储在.frm文件中。数据和索引存储在一块儿的而且存储在表空间中。可是默认状况下mysql会将数据库的全部InnoDB表存储在一个表空间中的。其实这种方式管理起来很是的不方便并且还不支持高级功能因此建议每一个表存储为一个表空间实现方式为:使用服务器变量innodb_file_per_table = 1。

若是须要频繁的进行更新、删除操做的数据库也可选择InnoDB存储引擎。由于该存储引擎能够实现事务提交和回滚。

  • MyISAM存储引擎

MyISAM存储引擎是Mysql中常见的存储引擎,MyISAM存储引擎是基于ISAM存储引擎发展起来的。MyISAM支持全文索引、压缩存放、空间索引(空间函数)、表级锁、延迟更新索引键。可是MyISAM不支持事务、行级锁、更没法忍受的是崩溃后不能保证彻底恢复(只能手动修复)。

MyISAM存储引擎的表存储成3个文件。文件的名字和表的名字相同。扩展名包含frm、MYD、MYI。其中frm为扩展名的文件存储表的结构;MYD为扩展名的文件存储数据,其是MYData的缩写;MYI为扩展名的文件存储索引,其为MYIndex的缩写。

MyISAM存储引擎的插入数据很快,空间和内存使用比较低。若是表主要是用于插入新记录和读出记录,那么选择MyISAM存储引擎可以实现处理的高效率。若是应用的完整性、并发性要求很低,也能够选择MyISAM存储引擎。

  • ARCHIVE

ARCHIVE,见名之意可看出是归档,因此归档以后不少的高级功能就再也不支持了仅支持插入(insert)和查询(select)两种功能, ARCHIVE存储引擎以前还不支持索引(在Mysql5.5之后开始支持索引了),可是它拥有很好的压缩机制。一般用于作仓库使用。

ARCHIVE存储引擎适用于存储日志信息或其余按时间序列实现的数据采集类的应用场景中。

  • CSV

CSV是将数据文件保存为CSV格式的的文件的,能够方便的导入到其余数据库中去(例如:excel表格,SQLserver等等),由此须要在数据库间自由共享数据时才偶尔建议使用此存储引擎。而且它也不支持索引;我的认为仅适用于数据交换。

  • BLACKHOME

BLACKHOME叫作黑洞,也就是说没有存储机制,任何数据都会被丢弃,可是会记录二进制日志。通常在Mysql复制(中继服务器)中常常用到,这个在Mysql复制博客中将详细介绍,敬请关注。

  • FEDERATED

FEDERATED能够实现跨服务器整理表,简单说就是它能够访问远程服务器上数据的存储引擎,因此说它再也不本地建立数据只会自动的创建一个链接到其余服务器上连接,有点相似于代理的功能,默认都是禁用的。

  • MEMORY存储引擎

MEMORY存储引擎是Mysql中的一类特殊的存储引擎。其使用存储在内存中的内存来建立表,并且全部数据保存在内存中。数据安全性很低,可是查找和插入速度很快。若是内存出现异常就会影响到数据的完整性,若是重启或关机,表中的全部数据就会丢失,所以基于MEMORY存储引擎的表的生命周期很短,通常都是一次性的。适用于某些特殊场景像查找和映射,缓存周期性的聚合数据等等。

  • MRG_MYISAM

MRG_MYISAM存储引擎是合并MyISAM表的,就是将多个MyISAM合并为一个(在用户看来是一个进行工做,实际上是多个底层物理文件在运行工做)。

  • 扩展一些第三方存储引擎

(1)、OLTP类:

XtraDB:InnoDB的改进版

PBXT:支持复制,外键约束,并且支持在固态存储(SSD硬盘)上快速存取数据,是一个不错的支持事务的存储引擎,可是此存在的bug已再也不修复,被弃用。

TokuDB:图库数据库,在存储海量数据的方面有着mysql没法比拟的优点,也有mysql版的,其最大优点支持分形树索引结构,这个结构致使它和缓存无关也就直接致使了就算索引在数据库文件中放不下也不会影响性能。通常只适用于大量插入数据的分析型场景。(注释:这里的图不是照片等,而是复杂数据链接的数据结构。)

(2)、列式存储引擎

列式数据库:此种数据库最适合存储大数据,在数据检索上也很好可是在必定程度上须要反关系存储,所以可能没法知足咱们关系型数据库范式的概念因此被称为Nosql。

下面介绍几个列式存储引擎(都有两个版本:社区版、商业版):

Infobright:适合于数十TB的大环境中、支持数据压缩,默认状况下mysql不支持列式存储功能须要定制。使用者众多,名气很高。

MonetDB:首先,它的存储模型是对数据从垂直方向进行切分;其次,MonetDB是第一个利用CPU缓存对数据的查询进行优化的数据库系统;此外,MonetDB会自动管理和协调索引机制,优化查询效率。目前使用者不是不少。

InfiniDB:InfiniDB Community Edition (社区版)提供一个可伸缩的分析型数据库引擎,主要为数据仓库、商业智能、以及对实时性要求不严格的应用而开发。基于 MySQL 搭建。包括对查询、事务处理以及大数据量加载的支持。目前使用者不是不少。

LucidDB:是惟一一款专一于数据仓库和商务智能的开源RDBMS,它使用了列存储架构,支持位图索引,哈希链接/聚合和页面级多版本,大部分数据库最初都注重事务处理能力,而分析功能都是后来才加上去的。相反,LucidDB中的全部组件从一开始就是为知足灵活的需求,高性能数据集成和大规模数据查询而设计的,此外,其架构设计完全从用户出发,操做简单。目前使用者不是不少。

(3)、社区存储引擎(了解):

Aria:Maria的下一代版本。

Groona:能够精确的实现全文索引引擎,能够替代MyISAM在索引上的特性。

QQGraph:支持图操做,由Open query研发

Sphinx:外在的服务器可以在Mysql基础上为Mysql构建一个高效的全文索引,经过C++研发,Mysql支持一个社区引擎叫SphinxSE,就是让Sphinx直接支持Mysql接口,在MariaDB5.5.32上被编译支持了。

Spider:支持分片,每个独立的分片能够实现独立的查询。

VPForMySQL:支持垂直分区,支持更大级别的数据操做更大级别的数据存储。


选择标准:

 一、是否须要支持事务??

 二、是否须要使用热备??(冷热备份

 三、崩溃恢复:可否接受崩溃??


我的建议:

 存储日志或按时间增加的数据:MyISAM、ARCHIVE

 论坛应用:InnoDB

 电商订单:InnoDB

 数据量大:Infobright、NoSQL、Sphinx


我的总结,但愿对博友们有用!!j_0019.gif

相关文章
相关标签/搜索