MySQL -- 存储引擎

介绍:

“存储引擎”从字面理解,“存储”的意思的存储数据。“引擎”一词来源于发动机,它是发动机中的核心部分。在软件工程领域,相似的称呼有“游戏引擎”、“搜索引擎”,它们都是相应程序或系统的核心组件。所以从这里可以看出“存储引擎”似乎也是数据库的核心。

存储引擎是MySQL有别于其他数据库管理系统的最大特色,也是作为MySQL核心的存在。存储引擎的作用就是规定了数据存储时的存储结构。

MySQL为什么要出现存储引擎?

由于不同业务产生了不同的数据,这些数据有的可能偏重于被频繁查询,有的要求增删速度快,有的则对事务、索引、外键有特殊规定。所以就需要使用不同的数据组织结构来将数据存储于表中,也就是需要使用不同的存储引擎。简单来说,就是业务直接决定了存储引擎。

MySQL存储引擎有哪些?

我们可以使用 SHOW ENGINES 命令来查看 MySQL 数据库使用的存储引擎,如下图所示:

 MySQL -- 存储引擎

介绍常见的三种数据库引擎:

(1)InnoDB存储引擎

InnoDB是MySQL默认的存储引擎,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,支持奔溃后自动回复,支持级联删除和更新

(2)MyISAM存储引擎

MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM支持表的压缩(压缩后的表是只读的,不可以进行修改等操作)和拥有较高的插入和查询速度,但不支持事务。

(3)MEMORY存储引擎

MEMORY 是内存型的数据库引擎,它会将表中的数据存储到内存中,因为它是内存级的数据引擎,因此具备最快速的查询效率但它的缺点是,重启数据库之后,所有数据都会丢失,因为这些数据是存放在内存中的。

如何选择数据库的引擎?

选择数据库引擎要从实际的业务情况入手,不同业务产生了不同的数据,比如是否需要支持事务?是否需要支持外键?是否需要支持持久化?以及是否支持地理位置存储以及索引等方面进行综合考量

最常用的数据库引擎是 InnoDB,它是 MySQL 5.5.5 之后的默认引擎,其优点是支持事务,且支持 4 种隔离级别(读未提交,读已提交,可重复读,串行化)。InnoDB 还支持外键、崩溃后的快速恢复、支持全文检索(需要 5.6.4+ 版本)、集群索引,以及地理位置类型的存储和索引等功能。

MyISAM 引擎是 MySQL 原生的引擎,但它并不支持事务功能,这也是后来被 InnoDB 替代为默认引擎的主要原因。MyISAM 有独立的索引文件,因此在读取数据方面的性能很高,它也支持全文索引、地理位置存储和索引等功能,但不支持外键。

InnoDB 和 MyISAM 都支持持久化,但 MEMORY 引擎是将数据直接存储在内存中了,因此在重启服务之后数据就会丢失,但它带来的优点是执行速度很快,可以作为临时表来使用。

我们可以根据实际的情况设置相关的数据库引擎,还可以针对不同的表设置不同的数据引擎,只需要在创建表的时候指定 engine=引擎名称即可,SQL 代码如下:

create table student(
   id int primary key auto_increment,
   uname varchar(60),
   age int
) engine=Memory;

补充说明

读未提交:也就是一个事务还没有提交时,它做的变更就能被其他事务看到。
读已提交:指的是一个事务只有提交了之后,其他事务才能看得到它的变更。
可重复读:此方式为默认的隔离级别,它是指一个事务在执行过程中(从开始到结束)看到的数据都是一致的,在这个过程中未提交的变更对其他事务也是不可见的。
串行化:是指对同一行记录的读、写都会添加读锁和写锁,后面访问的事务必须等前一个事务执行完成之后才能继续执行,所以这种事务的执行效率很低。

InnoDB 自增主键

在面试的过程中我们经常看到这样一道面试题:

在一个自增表里面一共有 5 条数据,id 从 1 到 5,删除了最后两条数据,也就是 id 为 4 和 5 的数据,之后重启的 MySQL 服务器,又新增了一条数据,请问新增的数据 id 为几?

我们通常的答案是如果表为 MyISAM 引擎,那么 id 就是 6,如果是 InnoDB 那么 id 就是 4。

但是这个情况在高版本的 InnoDB 中,也就是 MySQL 8.0 之后就不准确了,它的 id 就不是 4 了,而是 6 了。因为在 MySQL 8.0 之后 InnoDB 会把索引持久化到日志中,重启服务之后自增索引是不会丢失的,因此答案是 6,这个需要面试者注意一下。

常见面试题

(1)MySQL存储引擎有哪些?

(2)如何选择数据库的引擎?

(3)InnoDB 自增主键

参考/好文

拉钩教育 -- Java 源码剖析 34 讲

https://kaiwu.lagou.com/course/courseInfo.htm?courseId=59#/detail/pc?id=1776

MySQL -- 存储引擎

上一篇:用root帐号切换其他帐号提示 su: warning: cannot change directory to /home/oracle: Permission denied


下一篇:PostgreSQL入门(三)