Mysql 存储引擎
Mysql 核心在于存储引擎,想要深入学习 Mysql,必定要深入研究 Mysql 存储引擎
Mysql 支持哪些存储引擎?默认使用哪个?
Mysql 支持多种存储引擎,我们可以通过 SHOW ENGINES
命令来查看 Mysql 支持的所有存储引擎
从上图我们可以看出,Mysql 当前默认的存储引擎是 InnDB。并且,所有存储引擎中只有 InnDB 是事务性存储引擎,也就是只有 InnDB 支持事务。
我们这里使用的 Mysql 版本是 8.x,不同的 Mysql 版本之前可能会有差别。
Mysql 5.5.5 之前,MyISAM 是 Mysql 的默认存储引擎。5.5.5 版本以后,InnDB 是 Mysql 的默认存储引擎
我们可以通过 SELECT VERSION()
命令查看我们的 Mysql 版本。
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.27 |
+-----------+
1 row in set (0.00 sec)
你也可以通过 SHOW VARIABLES LIKE '%storage_engine%'
命令直接查看 MySQL 当前默认的存储引擎。
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)
如果你想要深入了解每个存储引擎以及它们之间的区别,推荐你去阅读以下 MySQL 官方文档对应的介绍(面试不会问这么细,了解即可)
- InnoDB 存储引擎详细介绍:https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.htmlopen in new window 。
- 其他存储引擎详细介绍:https://dev.mysql.com/doc/refman/8.0/en/storage-engines.htmlopen in new window 。
Mysql 存储引擎架构了解吗
Mysql 存储引擎采用的是 插件式架构 ,支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适用不同场景的需要。存储引擎是基于表的,而不是数据库。
并且,我们还可以根据 Mysql 官方定义的存储引擎实现标准接口来编写一个属于自己的存储引擎。这些非官方提供的存储引擎可以称为第三方存储引擎,区别于官方存储引擎。像目前最常用的 InnDB 其实最开始就是一个第三方存储引擎,后面由于过于优秀,其被 Oracle 直接收购了。
Mysql 官方文档也有介绍到如何编写一个属于自己的自定义存储引擎,地址:https://dev.mysql.com/doc/internals/en/custom-engine.html。
MyISAM 和 InnDB 有什么区别
1.是否支持行级锁
MyISAM 只有表级锁(table-level locking),而 InnDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
也就是说,MyISAM 一锁就锁住了整张表,这在并发情况下是不能容忍的,这也是为什么 InnDB 在并发写的时候,性能更好的原因。
2.是否支持事务
MyISAM 不提供事务支持
InnDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别,具有提交(commit)和回滚(rollback)事务的能力。并且,InnDB 默认使用的 REPEATABLE-READ (可重读)隔离级别是可以解决幻读问题发生的
3.是否支持外键
MyISAM 不支持外键,而 InnDB 支持外键
外键对于维护数据一致性非常有帮助,但是对性能有一定的损耗。因此,在通常情况下,我们是不建议在实际生产项目中使用,在业务代码中进行约束即可!
阿里的《Java开发手册》也是明确规定禁止使用外键的。
不过,在代码中进行约束的话,对程序员的能力要求更高,具体是否要采用外键还是要根据你的项目实际情况而定。
总结:一般我们也是不建议在数据库层面使用外键的,应用层面可以解决。不过,这样会对数据的一致性造成威胁。具体要不要使用外键还是要根据你的项目来决定。
4.是否支持数据库异常崩溃后的安全回复
MyISAM 不支持,而 InnDB 支持
使用 InnDB 的数据库在异常崩溃后,数据库重新启动的时候灰保证数据库恢复到崩溃前的状态。这个回复的过程依赖于 redo log
是否支持 MVCC
MyISAM 不支持,而 InnDB 支持
MyISAM 连行级锁都不支持,而 MVCC 可以看作是行级锁的一个升级,自然不支持
6.索引实现不一样
虽然 MyISAM 引擎和 InnDB 引擎都是使用 B+Tree 作为索引结构的,但是两者的实现方式不太一样
InnDB 引擎中,其数据文件本身就是索引文件。想必 MyISAM ,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
7.性能有差别
InnDB 的性能比 MyISAM 更强大,不管是在读写混合还是在只读模式下,随着 CPU 核数的增加,InnDB的读写能力呈线性增长,MyISAM 因为读写不能并发,它的处理能力和核数没有关系
**
InnDB 的性能比 MyISAM 更强大,不管是在读写混合还是在只读模式下,随着 CPU 核数的增加,InnDB的读写能力呈线性增长,MyISAM 因为读写不能并发,它的处理能力和核数没有关系