数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。简而言之,存储引擎就是指表的类型。数据库的存储引擎决定了表在计算机中的存储方式。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。

现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。

MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
image.png
MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。可以使用SHOW ENGINES;语句查看系统所支持的引擎类型,结果如图所示。
image.png
Support 列的值表示某种引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示该引擎为当前默认的存储引擎。

存储引擎

关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差。而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异。那么,对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。我的学习方法是先学会用,懂得怎么用,再去知道到底是如何能用的。下面就对MySQL支持的存储引擎进行简单的介绍。

存储引擎 描述
ARCHIVE 用于数据存档的引擎,数据被插入后就不能在修改了(只支持SELECT和INSERT语句),且不支持索引。
CSV 在存储数据时,会以逗号作为数据项之间的分隔符。
BLACKHOLE 会丢弃写操作,该操作会返回空内容。
FEDERATED 将数据存储在远程数据库中,用来访问远程表的存储引擎。
InnoDB 支持事务、行级锁以及外键等功能。
MEMORY 置于内存的表,也就是说将数据存放于内存之中,类似于Redis。
MERGE 用来管理由多个 MyISAM 表构成的表集合。
MyISAM 主要的非事务处理存储引擎,性能相对于InnoDB来说要高一些。
NDB MySQL 集群专用存储引擎

查看存储引擎信息

通常情况下,我们使用数据库存储数据的时候,都会使用到存储引擎,下面我们来一起看看MySQL数据库支持哪些存储引擎。

查看当前数据库中支持的存储引擎

  1. mysql> show engines;

临时设置数据库存储引擎

  1. mysql> set default_storage_engine=MyISAM;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> SELECT @@default_storage_engine;
  4. +--------------------------+
  5. | @@default_storage_engine |
  6. +--------------------------+
  7. | MyISAM |
  8. +--------------------------+
  9. 1 row in set (0.00 sec)

查看某个表的存储引擎

  1. mysql> SHOW CREATE TABLE db1.db01\G
  2. *************************** 1. row ***************************
  3. Table: db01
  4. Create Table: CREATE TABLE `db01` (
  5. `name` varchar(20) DEFAULT NULL,
  6. `id` int(11) NOT NULL AUTO_INCREMENT,
  7. `sex` varchar(20) DEFAULT NULL,
  8. `addr` varchar(20) DEFAULT NULL,
  9. PRIMARY KEY (`id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  11. 1 row in set (0.00 sec)
  12. mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'db01' AND TABLE_SCHEMA = 'db1'\G
  13. *************************** 1. row ***************************
  14. TABLE_NAME: db01
  15. ENGINE: InnoDB
  16. 1 row in set (0.00 sec)
  17. mysql> SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_NAME="pm20";
  18. +--------+
  19. | ENGINE |
  20. +--------+
  21. | MyISAM |
  22. +--------+
  23. 1 row in set (0.00 sec)

查看myisam的表有哪些

  1. mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam';
  2. +--------------+------------------+--------+
  3. | table_schema | table_name | engine |
  4. +--------------+------------------+--------+
  5. | db1 | Dem_Picture | MyISAM |
  6. | db1 | t2 | MyISAM |
  7. | mysql | columns_priv | MyISAM |
  8. | mysql | db | MyISAM |
  9. | mysql | event | MyISAM |
  10. | mysql | func | MyISAM |
  11. | mysql | ndb_binlog_index | MyISAM |
  12. | mysql | proc | MyISAM |
  13. | mysql | procs_priv | MyISAM |
  14. | mysql | proxies_priv | MyISAM |
  15. | mysql | tables_priv | MyISAM |
  16. | mysql | user | MyISAM |
  17. +--------------+------------------+--------+
  18. 12 rows in set (0.07 sec)

查看innodb的表有哪些

  1. mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb';
  2. +--------------------+---------------------------+--------+
  3. | table_schema | table_name | engine |
  4. +--------------------+---------------------------+--------+
  5. | information_schema | COLUMNS | InnoDB |
  6. | information_schema | EVENTS | InnoDB |
  7. | information_schema | OPTIMIZER_TRACE | InnoDB |
  8. | information_schema | PARAMETERS | InnoDB |
  9. | information_schema | PARTITIONS | InnoDB |
  10. | information_schema | PLUGINS | InnoDB |
  11. | information_schema | PROCESSLIST | InnoDB |
  12. | information_schema | ROUTINES | InnoDB |
  13. | information_schema | TRIGGERS | InnoDB |
  14. | information_schema | VIEWS | InnoDB |
  15. | db1 | db01 | InnoDB |
  16. | db1 | t1 | InnoDB |
  17. | mysql | engine_cost | InnoDB |
  18. | mysql | gtid_executed | InnoDB |
  19. | mysql | help_category | InnoDB |
  20. | mysql | help_keyword | InnoDB |
  21. | mysql | help_relation | InnoDB |
  22. | mysql | help_topic | InnoDB |
  23. | mysql | innodb_index_stats | InnoDB |
  24. | mysql | innodb_table_stats | InnoDB |
  25. | mysql | plugin | InnoDB |
  26. | mysql | server_cost | InnoDB |
  27. | mysql | servers | InnoDB |
  28. | mysql | slave_master_info | InnoDB |
  29. | mysql | slave_relay_log_info | InnoDB |
  30. | mysql | slave_worker_info | InnoDB |
  31. | mysql | time_zone | InnoDB |
  32. | mysql | time_zone_leap_second | InnoDB |
  33. | mysql | time_zone_name | InnoDB |
  34. | mysql | time_zone_transition | InnoDB |
  35. | mysql | time_zone_transition_type | InnoDB |
  36. | sys | sys_config | InnoDB |
  37. | test | student | InnoDB |
  38. | test | t1 | InnoDB |
  39. +--------------------+---------------------------+--------+
  40. 34 rows in set (0.01 sec)

修改存储引擎

在使用数据库的时候,我们经常会去使用不同的存储引擎来存储数据,那就难免需要修改存储引擎。下面我们介绍几个存储引擎的修改方法。

修改配置文件(永久)

  1. vim /etc/my.cnf
  2. [mysqld]
  3. default-storage-engine=innodb
  4. innodb_file_per_table=1 # InnoDB独立表空间

临时修改存储引擎(临时)

  1. mysql> set default_storage_engine=MyISAM;
  2. Query OK, 0 rows affected (0.00 sec)
  3. mysql> SELECT @@default_storage_engine;
  4. +--------------------------+
  5. | @@default_storage_engine |
  6. +--------------------------+
  7. | MyISAM |
  8. +--------------------------+
  9. 1 row in set (0.00 sec)

创建表的时候修改存储引擎

  1. CREATE TABLE shanhe(id INT) ENGINE=innodb;

存储引擎的实验

下面我们用几个实验来测试几个存储引擎的区别。

  1. mysql> use db1;
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4. Database changed
  5. mysql> create table t1(id int)engine=innodb;
  6. Query OK, 0 rows affected (0.03 sec)
  7. mysql> create table t2(id int)engine=myisam;
  8. Query OK, 0 rows affected (0.00 sec)
  9. mysql> create table t3(id int)engine=memory;
  10. Query OK, 0 rows affected (0.00 sec)
  11. mysql> create table t4(id int)engine=blackhole;
  12. Query OK, 0 rows affected (0.00 sec)
  13. mysql> show tables;
  14. +---------------+
  15. | Tables_in_db1 |
  16. +---------------+
  17. | t1 |
  18. | t2 |
  19. | t3 |
  20. | t4 |
  21. +---------------+
  22. 6 rows in set (0.00 sec)
  23. mysql> exit
  24. Bye
  25. root@756ad135dd2e:/var/lib/mysql/db1# ls
  26. t1.frm t1.ibd t2.MYD t2.MYI t2.frm t3.frm t4.frm
  27. # 发现后两种存储引擎只有表结构,无数据。
  28. # memory,在重启mysql或者重启机器后,表内数据清空。
  29. # blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录。
  30. # innodb支持事务,而myisam存储引擎是不支持事务。