第 2 章 Mysql 存储引擎

作者: Brinnatt 分类: mysql 经验专题 发布时间: 2023-01-13 15:31

2.1、查看存储引擎

查看 mysql 提供什么存储引擎:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | 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         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

2.2、设置系统默认的存储引擎

  1. 查看默认的存储引擎。

    mysql> show variables like '%storage_engine%';
    +---------------------------------+-----------+
    | Variable_name                   | Value     |
    +---------------------------------+-----------+
    | default_storage_engine          | InnoDB    |
    | default_tmp_storage_engine      | InnoDB    |
    | disabled_storage_engines        |           |
    | internal_tmp_mem_storage_engine | TempTable |
    +---------------------------------+-----------+
    4 rows in set (0.00 sec)
    
    mysql> select @@default_storage_engine;
    +--------------------------+
    | @@default_storage_engine |
    +--------------------------+
    | InnoDB                   |
    +--------------------------+
    1 row in set (0.00 sec)
  2. 修改默认的存储引擎。

    如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 如果我们想改变表的默认存储引擎的话,可以如下设置:

    SET DEFAULT_STORAGE_ENGINE=MyISAM;

    或者修改 my.cnf 文件:

    default-storage-engine=MyISAM
    # 重启服务
    systemctl restart mysqld.service

2.3、设置表的存储引擎

存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为不同的表设置不同的存储引擎,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。

2.3.1、创建表时指定存储引擎

我们之前创建表的语句都没有指定表的存储引擎,那就会使用默认的存储引擎 InnoDB 。如果我们想显式的指定一下表的存储引擎,那可以这么写:

CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;

2.3.2、修改表的存储引擎

如果表已经建好了,我们也可以使用下边这个语句来修改表的存储引擎:

ALTER TABLE 表名 ENGINE = 存储引擎名称;

比如我们修改一下 engine_demo_table 表的存储引擎:

mysql> ALTER TABLE engine_demo_table ENGINE = InnoDB;

这时我们再查看一下 engine_demo_table 的表结构:

mysql> SHOW CREATE TABLE engine_demo_table\G
*************************** 1. row ***************************
Table: engine_demo_table
Create Table: CREATE TABLE `engine_demo_table` (
`i` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

2.4、引擎介绍

2.4.1、InnoDB 引擎

具备外键支持功能的事务存储引擎:

  • MySQL 从 v3.23.34a 开始就包含 InnoDB 存储引擎。 大于等于 v5.5 之后,默认采用 InnoDB 引擎。
  • InnoDB 是 MySQL 的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
  • 除了增加和查询外,还需要更新、删除操作,那么,应优先选择 InnoDB 存储引擎。 除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑 InnoDB 引擎。
  • 数据文件结构:
    • 表名 .frm 存储表结构(MySQL8.0 时,合并在表名 .ibd 中)。
    • 表名 .ibd 存储数据和索引。
  • InnoDB 是为处理巨大数据量而设计的高性能存储引擎。
    • 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除了。比如:.frm.par.trn.isl.db.opt 等都在 MySQL8.0 中不存在了。
  • 对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一些,并且会占用更多的磁盘空间以保存数据和索引。
  • MyISAM 只缓存索引,不缓存真实数据;InnoDB 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。

2.4.2、MyISAM 引擎

主要的非事务处理存储引擎:

  • MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但 MyISAM 不支持事务、行级锁、外键,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
  • 5.5 之前默认的存储引擎。
  • 优势是访问的速度快,对事务完整性没有要求或者以 SELECT、INSERT 为主的应用。
  • 针对数据统计有额外的常量存储。故而 count(*) 的查询效率很高。
    • 表名 .frm 存储表结构。
    • 表名 .MYD 存储数据(MYData)。
    • 表名 .MYI 存储索引(MYIndex)。
  • 应用场景:只读应用或者以读为主的业务。

2.4.3、Archive 引擎

用于数据存档,下表展示了 ARCHIVE 存储引擎功能:

特征 支持
B 树索引
备份/时间点恢复(在服务器中实现,而不是在存储引擎中)
集群数据库支持
聚集索引
压缩数据
数据缓存
加密数据(加密功能在服务器中实现)
外键支持
全文检索索引
地理空间数据类型支持
地理空间索引支持
哈希索引
索引缓存
锁粒度 行锁
MVCC
存储限制 无限制
交易
更新数据字典的统计信息

2.4.4、Blackhole 引擎

丢弃写操作,读操作会返回空内容。

2.4.5、CSV 引擎

存储数据时,以逗号分隔各个数据项,使用案例如下:

mysql> CREATE TABLE test (i INT NOT NULL, c CHAR(10) NOT NULL) ENGINE = CSV;
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from test;
+---+------------+
| i | c          |
+---+------------+
| 1 | record one |
| 2 | record two |
+---+------------+
2 rows in set (0.00 sec)

创建 CSV 表还会创建相应的元文件,用于存储表的状态和表中存在的行数。此文件的名称与表的名称相同,后缀为 CSM。如下所示:

[root@node01 ~]# ll /var/lib/mysql/test/test*
-rw-r----- 1 mysql mysql 2457 Sep  9 05:20 /var/lib/mysql/test/test_373.sdi
-rw-r----- 1 mysql mysql   35 Sep  9 05:20 /var/lib/mysql/test/test.CSM
-rw-r----- 1 mysql mysql   30 Sep  9 05:20 /var/lib/mysql/test/test.CSV

使用 Notepad++ 打开 test.CSV 内容如下:

"1","record one"
"2","record two"

这种格式可以被 Microsoft Excel 等电子表格应用程序读取,甚至写入。使用 Microsoft Excel 打开如图所示:

mysql_csv_excel

2.4.6、Memory 引擎

置于内存的表。

概述

Memory 采用的逻辑介质是内存,响应速度很快,但是当 mysqld 守护进程崩溃的时候数据会丢失。另外,要求存储的数据是数据长度不变的格式,比如,Blob 和 Text 类型的数据不可用(长度不固定的)。

主要特征

  • Memory 同时支持哈希(HASH)索引和 B+ 树索引。
  • Memory 表至少比 MyISAM 表要快一个数量级。
  • MEMORY 表的大小是受到限制的。表的大小主要取决于两个参数,分别是 max_rows 和 max_heap_table_size。其中,max_rows 可以在创建表时指定;max_heap_table_size 的大小默认为 16MB,可以按需要进行扩大。
  • 数据文件与索引文件分开存储。
  • 缺点:其数据易丢失,生命周期短。基于这个缺陷,选择 MEMORY 存储引擎时需要特别小心。

使用 Memory 存储引擎的场景

  1. 目标数据比较小,而且非常频繁的进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数 max_heap_table_size 控制 Memory 表的大小,限制 Memory 表的最大的大小。
  2. 如果数据是临时的,而且必须立即可用得到,那么就可以放在内存中。
  3. 存储在 Memory 表中的数据如果突然间丢失的话也没有太大的关系 。

2.4.7、Federated 引擎

访问远程表。

Federated 引擎是访问其他 MySQL 服务器的一个代理,尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁用的。

2.4.8、Merge 引擎

管理多个 MyISAM 表构成的表集合。

2.4.9、NDB 引擎

MySQL 集群专用存储引擎。

也叫做 NDB Cluster 存储引擎,主要用于 MySQL Cluster 分布式集群环境,类似于 Oracle 的 RAC 集群。

2.4.10、存储引擎对比

MySQL 中同一个数据库,不同的表可以选择不同的存储引擎。下表为官方对比:

Feature MyISAM Memory InnoDB Archive NDB
B-tree indexes Yes Yes Yes No No
Backup/point-in-time recovery (note 1) Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Clustered indexes No No Yes No No
Compressed data Yes (note 2) No Yes Yes No
Data caches No N/A Yes No Yes
Encrypted data Yes (note 3) Yes (note 3) Yes (note 4) Yes (note 3) Yes (note 3)
Foreign key support No No Yes No Yes (note 5)
Full-text search indexes Yes No Yes (note 6) No No
Geospatial data type support Yes No Yes Yes Yes
Geospatial indexing support Yes No Yes (note 7) No No
Hash indexes No Yes No (note 8) No Yes
Index caches Yes N/A Yes No Yes
Locking granularity Table Table Row Row Row
MVCC No No Yes No No
Replication support (note 1) Yes Limited (note 9) Yes Yes Yes
Storage limits 256TB RAM 64TB None 384EB
T-tree indexes No No No No Yes
Transactions No No Yes No Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes

其实我们最常用的就是 InnoDB 和 MyISAM,有时会提一下 Memory。其中 InnoDB 是 MySQL 默认的存储引擎。

标签云