zoukankan      html  css  js  c++  java
  • (转)Mysql数据库存储引擎

    什么是MySql数据库

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

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

        存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
        在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 数据库的存储引擎


       由上图可见当前系统的默认数据表类型是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 ENGINESG
    *************************** 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, storedinmemory, usefulfortemporary tables
    Transactions: NO
              XA: NO
      Savepoints: NO
    8 rows inset(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 inset(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 STATUSG
    *************************** 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:支持垂直分区,支持更大级别的数据操作更大级别的数据存储。


    选择标准:

     1、是否需要支持事务??

     2、是否需要使用热备??(冷热备份

     3、崩溃恢复:能否接受崩溃??


    个人建议:

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

     论坛应用:InnoDB

     电商订单:InnoDB

     数据量大:Infobright、NoSQL、Sphinx


    个人总结,希望对博友们有用!!j_0019.gif

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/lixuwu/p/5676131.html
Copyright © 2011-2022 走看看