MySQL-存储引擎

《MySQL-逻辑架构》这篇文章中我们知道,MySQL服务端主要有查询缓存、语法解析、连接池、优化器这写模块。执行SQL时,是按照优化器生成的执行计划来执行的。实际上是根据这个计划调用存储引擎的API来执行的,最后返回结果就行了。

MySQL中有存储引擎这样一个概念,简单来说就是指表的类型。存储引擎在以前都是叫做表处理器,只是后来才改名叫做存储引擎。其主要功能就是接收命令,然后对表进行读写操作。这里以MySQL8.0.31为例,我们可以使用SHOW engines;来查看MySQL中的存储引擎。

mysql> SHOW engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster         | NO      | Clustered, fault-tolerant tables                               | NULL         | NULL | NULL       |
| 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         |
| ndbinfo            | NO      | MySQL Cluster system information storage engine                | NULL         | NULL | NULL       |
| 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         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)

设置存储引擎

设置系统默认存储引擎

我们可以使用下面两个命令来查看默认的存储引擎:

  • SHOW variables LIKE '%storage_engine%';

    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)
    
  • SELECT @@default_storage_engine;

    mysql> SELECT @@default_storage_engine;
    +--------------------------+
    | @@default_storage_engine |
    +--------------------------+
    | InnoDB                   |
    +--------------------------+
    1 row in set (0.00 sec)
    

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

mysql> SET DEFAULT_STORAGE_ENGINE=MyISAM;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| MyISAM                   |
+--------------------------+
1 row in set (0.00 sec)

或者修改配置文件:

default-storage-engine=MyISAM

修改配置文件后需要重启MySQL。

设置表的存储引擎

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

创建表时指定存储引擎

当我们创建表的时候没有指定表的存储引擎,那么MySQL的表默认会使用InnoDB。但是如果想要指定存储引擎则可以这样写:

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

修改表的存储引擎

对于已经创建好的表,则可以这样修改表的存储引擎:

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

存储引擎简介

前面我们看到了一堆的存储引擎,它们分别有什么作用呢?这里简单介绍一下。

  1. InnoDB引擎:具备外键支持功能的事务存储引擎。
  2. MyISAM引擎:主要的非事务处理存储引擎。
  3. Archive引擎:用于数据存档。
  4. Blackhole引擎:丢弃写操作,读操作会返回空内容。
  5. CSV引擎:存储数据时,以逗号分隔各个数据项。
  6. Memory引擎:置于内存的表。
  7. Federated引擎:访问远程表。
  8. Merge引擎:管理多个MyISAM表构成的表集合。
  9. NDB引擎:MySQL集群专用存储引擎。

引擎对比

MySQL中同一个数据库,不同的表可以选择不同的存储引擎。如下表对常用存储引擎做出了对比:

特点 MyISAM InnoDB MEMORY MERGE NDB
存储限制 64TB
事务安全
锁机制 表锁 行锁 表锁 表锁 行锁
B树索引
哈希索引
全文索引
集群索引
数据缓存
索引缓存 只缓存索引,
不缓存真实数据
不仅缓存索引还要缓存真实数据,
对内存要求较高,
且内存大小对性能有决定性的影响
数据可压缩
空间使用
内存使用
批量插入的速度
外 键

MyISAM和InnoDB

MyISAM和InnoDB到底选择哪个比较好呢?

MySQL5.5之前的默认存储引擎是MyISAM,之后改为了InnoDB。下面让我们对比下二者:

MyISAM InnoDB
外键
事务
行表锁 表锁:
即使操作一条记录也会锁住 整个表,不适合高并发的操作
行锁:
操作时只锁某一行,不对其它行有影响, 适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响
自带系统表使用
特点 性能:节省资源、消耗少、简单业务 事务:并发写、事务、更大资源
默认安装
默认使用