zoukankan      html  css  js  c++  java
  • MySQL存储引擎对比

    一.MySQL的存储引擎

      大家应该知道MySQL的存储引擎应该是表级别的概念,因为我们无法再创建database时指定存储引擎,而是只能在创建表的时候可以明确指定使用哪种存储引擎。因此存储引擎也通常被称作“表类型”。也就是说,存储引擎是负责跟文件系统真正数据打交道的工具,它却决定了表中是如何存储数据的,不用存储引擎他们指出的工作特性是各不相同的。所以,我们在工作时应该选择时候适合自己的存储引擎。
    1>.查看MySQL支持的所有存储引擎
    mysql> show engines;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.01 sec)
    2>.查看某张表的存储引擎
      使用格式: SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
    mysql> show table status in chensiting like 'students'G               #我们可以用like来过滤
    *************************** 1. row ***************************
               Name: students                                          -------->表名
             Engine: InnoDB                                          ------->存储引擎
            Version: 10                                              -------->版本
         Row_format: Compact                                      -------->行格式
               Rows: 8                                               -------->现存表中的行数,对于InnoDB的存储引擎的话这个数字可能只是一个估计值,因为innodb支持事物,其中还保存着删除的行数。
     Avg_row_length: 2048                                          --------->平均每行所包含的字节数
        Data_length: 16384                                          --------->表中数据总体大小,单位是字节
    Max_data_length: 0                                              --------->表能够占用的最大空间,单位为字节。注意,“0”则表示没有上线哟!
       Index_length: 16384                                          --------->索引的大小,单位也是字节
          Data_free: 0                                                ---------->对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间。
     Auto_increment: 13                                           ---------->下一个AUTO_INCREMENT的值
        Create_time: 2020-11-21 04:11:46                              ----------->表的创建时间
        Update_time: NULL                                          ----------->表数据的最后一次修改时间
         Check_time: NULL                                          ------------>使用CHECK TABLE或myisamchk最近一次检查表的时间
          Collation: utf8_general_ci                                      ------------->排序规则
           Checksum: NULL                                          ------------->如果启动,则为表的checksum
     Create_options:                                               ------------->创建表时指定使用的其他选项
            Comment:                                               ------------->表的注释信息
    1 row in set (0.00 sec)
    mysql> show table status in chensiting where name='students'G       #当然用where查询的性能会更好
    *************************** 1. row ***************************
               Name: students
             Engine: InnoDB
            Version: 10
         Row_format: Compact
               Rows: 8
     Avg_row_length: 2048
        Data_length: 16384
    Max_data_length: 0
       Index_length: 16384
          Data_free: 0
     Auto_increment: 13
        Create_time: 2020-11-21 04:11:46
        Update_time: NULL
         Check_time: NULL
          Collation: utf8_general_ci
           Checksum: NULL
     Create_options: 
            Comment: 
    1 row in set (0.00 sec)

    3>.行格式

      MySQL的行格式有:
        {DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT},
        
      其中DYNAMIC|FIXED|COMMPRESSED是MyISAM常用的的,而InnoDB即可以使用MyISAM常用的类型还可以使用REDUNDANT|COMPACT等等。

    二.MyISAM和InnoDB的存储引擎对比

    1>.什么是表空间(table space)
    它是由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引

    2>.MyISAM数据存储结果

     MySQL的每个表都在数据库目录下存储三个文件,名称如下:
        a>.tb_name.frm #存储表结构
        b>.tb_name.MYD #存储数据
        c>.tb_name.MYI #存储索引

    3>.InnoDB

      Innodb有两种格式:
        a>.innodb_file_per_table=OFF,即是用共享表空间
          每个表一个独有的格式定义文件:tb_name.frm
          还有一个默认位于数据目录下的共享的表空间文件:ibdata#(它是会自动增长的,比如ibdata1,ibdata2,...)
        b>.innodb_file_per_table=ON,即是用独立表空间
          每个表在数据库目录下存储两个文件
            tb_name.frm #存储表结构
            tb_name.ibd #存储数据

    4>.修改默认的存储引擎

    通过default_storage_engine服务变量实现。可以用mysql> show variables like '%default%'来查看相应的信息

    三.MySQL各存储引擎的特性

    1>.InnoDB存储引擎
      a>.支持事务:
          有事务日志,这些事物日志文件的大小是一致的哟!):ib_logfile#(例如:ib_logfile0,ib_logfile1,....);
      b>.支持外键约束;
      c>.支持MVCC(多版本并发控制);
      d>.支持聚簇索引:
          聚簇索引之外的其他索引,通常称之为辅助索引,一张表聚簇索引只能有一个而辅助索引可以有多个。聚簇索引通常是用主键的方式来实现,(因为主键的数据是不允许重复的);
      e>.行级锁:间隙锁;
      f>.支持使用辅助索引;
      g>.支持自适应的hash索引;
      h>.支持热备份,因此数据不需要离线就可以完成备份啦,当然可能要用独立表空间;

    2>.MyISAM

    MyISAM的使用场景:
        只读数据,表较小,能够忍受崩溃后的修复操作和数据丢失,它具有一下特点:
          a>.全文索引
          b>.支持表压缩存放:做数据仓库,能节约存储空间并提升性能
          c>.支持空间索引
          d>.表级锁
          e>.延迟更新索引
          f>.不支持事务、外键和行级锁
          g>.崩溃后无法安全恢复数据
      MySQL的mysql库使用就是MyISAM存储引擎,我们可以使用“mysql> show table status in mysqlG”进行查看。
    

    3>.ARCHIVE(归档)

    仅支持INSERT和SELECT,支持很好压缩功能。应用于存储日志信息,或其他按照时间序列实现的数据采集类的应用。它不支持事物,不能很好的支持索引

    4>.CSV

    将数据存储为CSV格式,不支持索引,仅使用与数据交换场景。说白了就是可以在多种不同的数据库之间来回导入导出数据库的。也就是说我们可以将office的文档保存为CSV就可以直接向MySQL数据库导入;

    5>.BLACKHOLE

    又名黑洞存储引擎,没有存储机制,任何发往次引擎的数据都会丢弃,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器

    6>.MEMORY

    保存数据在内存中,它是一个内存表(也就是说重启操作系统之后就会丢失该表的数据哟!);常用于保存中间数据,如周期性的聚合数据等,也用于实现临时表,支持hash索引,使用表级锁,不支持BLOB和TEXT数据类型。

    7>.MRG_MYISAM

    是MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表。它是传统的MySQL存储引擎,现在基本上很少有人用了,因为一个表的数据内容本来就很大了,人们更多考虑的是如何将一张表的内容如何拆分开来。

    8>NDB

    是MySQL CLUSTER中专用的存储引擎。它是集群用的一种存储引擎,但是这种集群案例用的几乎寥寥无几

    四.第三方的存储引擎

    1>.在线存储引(简称,OLPT),常见的有以下三种:
      XtraDB
        它是增强的InnoDB,有Percona提供。
        编译安装时,下载XtraDB的源码替代MySQL存储引擎中的InnoDB的源码(当然你得把XtraDB的名称改为InnoDB哟)
      PBXT:
        MariaDB自带此存储引擎
        支持引擎级别的复制、外键约束,对SSD磁盘(固态磁盘)提供适当支持,当然也支持事务和MVCC等等。
      TokuDB:
        使用 Fractal Trees索引,适用存储大数据,拥有很好的压缩比,已经被引入MariaDB。

    2>.按照列式数据存储引擎分为以下几种4种:

      Infobright
        目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计,分为商业版本和社区版本,其他三个都不是特别有名。
      InfiniDB
      MonetDB
      LucidDB

    3>.按照开源社区存储引擎分为以下几种:

      Aria:
        前身为Maria,是增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)
      Groona:
        全文索引引擎
      Mroonga:
        是基于Groona的二次开发版
      OQGraph:
        由open query研发,支持图(网状 )结构的存储引擎
      SphinxSE:
        为Sphinx全文搜索服务器提供了SQL接口
      Spider:
        能将数据切分成不同的分片,比较高效透明的实现了分片(shared),并支持在分片上支持并行查询

    五.如何选择合适的存储引擎

      我们一般从以下几个维度衡量:
        1>.是否需要事务;
        2>.备份的类型的支持;
        3>.崩溃后的恢复;
        4>.特有的特性;
  • 相关阅读:
    【设计模式】第九篇:组合模式解决层级关系结构问题
    【设计模式】第八篇:喝豆浆就是装饰者模式吗?
    【设计模式】第七篇:和我一起简单认识桥接模式
    【设计模式】第六篇:来康康适配器模式
    【设计模式】第五篇:什么是原型模式?浅提浅拷贝和深拷贝
    【计算机网络】学习笔记,第三篇:数据链路层(谢希仁版)
    一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
    单例模式的几种实现And反射对其的破坏
    缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
    图文并茂,带你深入了解AQS的源码
  • 原文地址:https://www.cnblogs.com/huihuangyan/p/14026913.html
Copyright © 2011-2022 走看看