数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。简而言之,存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。
现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;
语句查看系统所支持的引擎类型
Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。
关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差。而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异。那么,对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。我的学习方法是先学会用,懂得怎么用,再去知道到底是如何能用的。下面就对MySQL支持的存储引擎进行简单的介绍。
存储引擎 | 描述 |
---|---|
ARCHIVE | 用于数据存档的引擎,数据被插入后就不能在修改了(只支持SELECT和INSERT语句),且不支持索引。 |
CSV | 在存储数据时,会以逗号作为数据项之间的分隔符。 |
BLACKHOLE | 会丢弃写操作,该操作会返回空内容。 |
FEDERATED | 将数据存储在远程数据库中,用来访问远程表的存储引擎。 |
InnoDB | 支持事务、行级锁以及外键等功能。 |
MEMORY | 置于内存的表,也就是说将数据存放于内存之中,类似于Redis。 |
MERGE | 用来管理由多个 MyISAM 表构成的表集合。 |
MyISAM | 主要的非事务处理存储引擎,性能相对于InnoDB来说要高一些。 |
NDB | MySQL 集群专用存储引擎 |
在使用数据库的时候,我们经常会去使用不同的存储引擎来存储数据,那就难免需要修改存储引擎。下面我们介绍几个存储引擎的修改方法。
vim /etc/my.cnf [mysqld] default-storage-engine=innodb innodb_file_per_table=1 # 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)
mysql> CREATE TABLE shanhe(id INT) ENGINE=innodb;
下面我们用几个实验来测试几个存储引擎的区别。
mysql> use db1; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create table t1(id int)engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> create table t2(id int)engine=myisam; Query OK, 0 rows affected (0.00 sec) mysql> create table t3(id int)engine=memory; Query OK, 0 rows affected (0.00 sec) mysql> create table t4(id int)engine=blackhole; Query OK, 0 rows affected (0.00 sec) mysql> show tables; +---------------+ | Tables_in_db1 | +---------------+ | t1 | | t2 | | t3 | | t4 | +---------------+ 6 rows in set (0.00 sec) mysql> exit Bye root@756ad135dd2e:/var/lib/mysql/db1# ls t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm # 发现后两种存储引擎只有表结构,无数据。 # memory,在重启mysql或者重启机器后,表内数据清空。 # blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录。 # innodb支持事务,而myisam存储引擎是不支持事务。