存储引擎
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。简而言之,存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
为了管理方便,人们把连接管理
、查询缓存
、语法解析
、查询优化
这些并不涉及真实数据存储的功能划分为MySQL server
的功能,把真实存取数据的功能划分为存储引擎
的功能。各种不同的存储引擎向上边的MySQL server
层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。
所以在MySQL server
完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
常用存储引擎
MySQL
支持非常多种存储引擎:
存储引擎 | 描述 |
| 用与数据存档(行被插入后不能再修改) |
| 丢弃写操作,读操作会返回空内容 |
| 在存储数据时,以逗号分隔各个数据项 |
| 用来访问远程表 |
| 具备外键支持功能的事务存储引擎 |
| 置于内存的表 |
| 用来管理多个MyISAM表构成的表集合 |
| 主要的非事务处理存储引擎 |
| MySQL集群专用存储引擎 |
其实最常用的就是InnoDB
和MyISAM
,有时会提一下Memory
。其中InnoDB
是MySQL
默认的存储引擎,一些存储引擎对于某些功能的支持情况如下:
Feature | MyISAM | Memory | InnoDB | Archive | NDB |
B-tree indexes | yes | yes | yes | no | no |
Backup/point-in-time recovery | yes | yes | yes | yes | yes |
Cluster database support | no | no | no | no | yes |
Clustered indexes | no | no | yes | no | no |
Compressed data | yes | no | yes | yes | no |
Data caches | no | N/A | yes | no | yes |
Encrypted data | yes | yes | yes | yes | yes |
Foreign key support | no | no | yes | no | yes |
Full-text search indexes | yes | no | yes | no | no |
Geospatial data type support | yes | no | yes | yes | yes |
Geospatial indexing support | yes | no | yes | no | no |
Hash indexes | no | yes | no | no | yes |
Index caches | yes | N/A | yes | no | yes |
Locking granularity | Table | Table | Row | Row | Row |
MVCC | no | no | yes | no | no |
Query cache support | yes | yes | yes | yes | yes |
Replication support | yes | Limited | 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 |
不同的存储引擎支持不同的功能。
关于存储引擎的一些操作
查看当前服务器程序支持的存储引擎
我们可以用下边这个命令来查看当前服务器程序支持的存储引擎:
SHOW ENGINES;
来看一下调用效果:
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
mysql>
其中的Support
列表示该存储引擎是否可用,DEFAULT
值代表是当前服务器程序的默认存储引擎。Comment
列是对存储引擎的一个描述。Transactions
列代表该存储引擎是否支持事务处理。XA
列代表着该存储引擎是否支持分布式事务。Savepoints
代表着该列是否支持部分事务回滚。
设置表的存储引擎
我们前边说过,存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为不同的表设置不同的存储引擎,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。
创建表时指定存储引擎
我们之前创建表的语句都没有指定表的存储引擎,那就会使用默认的存储引擎InnoDB
(当然这个默认的存储引擎也是可以修改的,我们在后边的章节中再说怎么改)。如果我们想显式的指定一下表的存储引擎,那可以这么写:
CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;
比如我们想创建一个存储引擎为MyISAM
的表可以这么写:
mysql> CREATE TABLE engine_demo_table(
-> i int
-> ) ENGINE = MyISAM;
Query OK, 0 rows affected (0.02 sec)
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=MyISAM DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)
修改表的存储引擎
如果表已经建好了,我们也可以使用下边这个语句来修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
比如我们修改一下engine_demo_table
表的存储引擎:
mysql> ALTER TABLE engine_demo_table ENGINE = InnoDB;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
这时我们再查看一下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=utf8mb4
1 row in set (0.00 sec)
mysql>
可以看到该表的存储引擎已经改为InnoDB
了。