type
status
date
slug
summary
tags
category
icon
password
1、存储引擎分类
存储引擎是底层物理结构的实现,负责数据的存储和提取。常用的存储引擎有 InnoDB、MyISAM、Memory 等。每个存储引擎都有各自的特点,可以根据具体的应用建立不同存储引擎表。最常用的存储引擎是 InnoDB,它从 MySQL 5.5.8 版本开始成为默认的存储引擎。
请注意:存储引擎是基于表的,而不是基于库的。所以我们可以在同一个数据库里面建立多个类型的表,存储引擎也可被称为表类型。
查看当前 MySQL 支持的存储引擎:
主要存储引擎对比:
存储引擎 | MyISAM | InnoDB | Memory |
存储结构 | 每个MyISAM表在磁盘上存储成三个文件。分别为:
• .frm文件:表定义文件,存储表的定义数据
• .MYD文件:数据文件,存放表具体记录的数据
• .MYI 文件:索引文件,存储索引。 | 所有的表都保存在同一个数据文件中(也可能是多个文件,如果设置了独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。 | 所有的数据都保存在内存中,不需要进行磁盘I/O。 |
事务 | 不支持事务 | 支持事务 | 不支持事务 |
锁 | 表级锁 | 行级锁,并使用MVCC支持高并发 | 表级锁 |
外键 | 不支持 | 支持 | 不支持 |
索引 | 非聚集索引 | 聚集索引 | 非聚集索引 |
安全恢复 | 崩溃后无法安全恢复 | 支持安全恢复 | 如果数据库重启或发生崩溃,Memory表的结构还会保留,但数据会丢失。 |
其他 | MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。 | InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。 | ㅤ |
存储引擎的选择:
- 如果系统主要以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,可以选择 MyISAM。
- 如果需要临时表快速地访问数据,并且表数据不多,数据不会被修改,重启以后丢失也没有关系,可以选择 Memory 表。
- 其他情况优先 InnoDB。因为 InnoDB 具有事务、恢复速度快等优点。
如果表的数据非常大查询频繁,可以优先考虑分库分表,而不是修改存储引擎。
2、InnoDB下更新SQL的执行过程
以下面这条更新 SQL 为例
SQL 的整体执行流程如下。大部分执行步骤和查询过程相同,我们重点关注第 4 步存储引擎部分的执行过程:
- 客户端连接到MySQL服务器,将SQL更新语句发送到服务器;MySQL服务器连接池中会有一个连接和客户端建立连接,然后后台线程会从连接中获取到要执行的SQL语句,并发送给SQL接口去调度执行。
- 查询缓存。注意增删改时,会将查询缓存中 user 表相关的缓存都清空。
- SQL语句经过SQL解析器解析、优化器优化,得到一个执行路径,前面这些和执行查询其实都是类似的。
- 接着由执行引擎去调用底层的存储引擎接口,根据执行计划完成SQL语句的执行。
- 首先查询出要更新的数据,这一步会先判断缓冲池(Buffer Pool)中是否已经存在这条数据,如果已经存在了,则直接从缓存池获取数据返回。否则从磁盘数据文件中加载这条数据到缓冲池中,再返回数据。
- 获取到数据后,执行引擎会根据SQL更新数据,然后调用存储引擎更新数据。这一步会对数据加排它锁,避免并发更新问题。之后先写 undolog 到缓冲池,undolog 主要用于事务回滚、MVCC等;同时,undolog 也会产生 redolog 日志。
- 之后更新缓冲池中的数据,同时记录 redolog 到 RedoLog 缓冲池,redolog 主要用于保证数据的持久性,宕机恢复数据等。
- 最后提交事务,虽然没有手动 commit 提交事务,update 语句执行完成后也会有隐式的事务提交的。事务提交时,会先在MySQL服务器层面会写入 binlog,binlog是数据持久性的保证。最后将 redolog 刷入磁盘,完成事务提交。·
- 最底层的一部分就是磁盘上的数据文件、日志文件等,可以看到,InnoDB 设计了缓冲池来缓冲数据、undolog、redolog 等,这些内存中的数据最终都是要刷新到磁盘中才能保证数据不丢失的。至于为什么要这么设计,我们后面再分析。
- Author:mcbilla
- URL:http://mcbilla.com/article/4ce372a6-d316-4a01-b65f-25bbb6220cee
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts