本文基于MySQL 5.7.12,部分在很老的版本中可能不适用。

 

1、概述

    MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

    例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

    这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

    选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。

 

2、设置引擎

    在创建表的时候,可以指定要使用的存储引擎:

CREATE TABLE t1 (i INT) ENGINE = CSV;

    MySQL 5.7 默认的引擎是INNODB,所以,不指定引擎时,会自动使用INNODB。

    可以在配置文件中更改默认引擎,位置为my.cnf中的default-storage-engine参数。

    也可以动态的为当前连接设置默认引擎:

SET default_storage_engine=NDBCLUSTER;

    TEMPORARY存储引擎表示时临时表,不过也可以将其持久化。

    对于一个已存在的表,可以使用ALTER TABLE修改所使用的 存储引擎:

ALTER TABLE t ENGINE = InnoDB;

 

    如果设置的存储引擎不可用,会使用默认的存储引擎。

3、InnoDB

    InnoDB作为默认引擎,在高可用性和高性能的折中选择。

    主要优势:

  •     支持事物,具有提交,回滚和崩溃恢复能力的事务安全。
  •     支持行级锁和​​Oracle风格的读取增加多用户的并发性和性能。
  •     基于主键优化数据的查询。
  •     支持外键。
  •     可以自由的组合其他类型存储引擎的表,比如查询时join其他存储引擎的表。
  •     处理大量数据时的InnoDB已被设计为CPU的效率和最大的性能。

    相关功能支持:

    01

    说明:...

    InnoDB存储引擎保持在主内存中缓存数据和索引自己的缓冲池。默认情况下,使用innodb_file_per_table设置,每一个新的InnoDB表和与其相关的索引存储在一个单独的文件中。当innodb_file_per_table选项被禁用时,InnoDB存储在单个系统表空间中的表和索引,其中可能包括若干文件(或原始磁盘分区)。如MySQL的5.7.6中,InnoDB表也可以存储在表空间一般,这是共享可以存储数据的多个表的表空间。 InnoDB表可以处理大量数据,即使在运行系统中的文件大小限制为2GB。

    3.1、InnoDB体系结构

    ACID 模型

    ACID Model是一组数据库设计原则,InnoDB遵循该原则,下面具体解释。

    A: atomicity,即原子性。MySQL中的相关功能:

  •     自动提交设置。
  •     COMMIT语句。
  •     ROLLBACK语句。
  •     从information_schema表操作数据。

    C: consistency,即一致性。MySQL中的相关功能:

  •     InnoDB doublewrite buffer.
  •     InnoDB crash recovery.

    I: isolation,
    D: durability。