51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

MySQL-存储引擎

MySQL-存储引擎 {#mysql-%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

《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)

设置存储引擎 {#%E8%AE%BE%E7%BD%AE%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

设置系统默认存储引擎 {#%E8%AE%BE%E7%BD%AE%E7%B3%BB%E7%BB%9F%E9%BB%98%E8%AE%A4%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

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

  • 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。

设置表的存储引擎 {#%E8%AE%BE%E7%BD%AE%E8%A1%A8%E7%9A%84%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

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

创建表时指定存储引擎 {#%E5%88%9B%E5%BB%BA%E8%A1%A8%E6%97%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

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

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

修改表的存储引擎 {#%E4%BF%AE%E6%94%B9%E8%A1%A8%E7%9A%84%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E}

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

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

存储引擎简介 {#%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E%E7%AE%80%E4%BB%8B}

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

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

引擎对比 {#%E5%BC%95%E6%93%8E%E5%AF%B9%E6%AF%94}

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

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

MyISAM和InnoDB {#myisam%E5%92%8Cinnodb}

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

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

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

赞(0)
未经允许不得转载:工具盒子 » MySQL-存储引擎