MySQL 核心考点全解:ACID、引擎对比、SQL 执行流程
目录
执行一条SQL请求的过程是什么?
mysql的三大引擎
A - 原子性(Atomicity)
C - 一致性(Consistency)
I - 隔离性(Isolation)
D - 持久性(Durability)
mysql为什么InnoDB是默认引擎?
mysql的InnoDB与MyISAM的区别
执行一条SQL请求的过程是什么?
由图可以清晰看到
连接器:用于与客户端建立连接,用户管理,校验身份
查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
解析器:把sql语句进行词法分析、语法分析然后构建语法树,方便后续模块读取sql语句的表名、字段名、字段、语句
执行sql:分为3步
预处理:检查表或字段是否存在;将 select * 中的 * 扩展为表上所有的列
优化:基于查询成本的考虑,选择查询成本最低的计划
执行:根据执行计划执行SQL查询语句,从存储引擎读取记录,返回给客户端
mysql的三大引擎
InnoDB:是MySQL的默认引擎,具有ACID事务支持、行级锁、外键约束等特性,有较好的数据完整性和并发控制能力,适用于高并发场景
A - 原子性(Atomicity)
核心:事务是一个不可分割的整体,要么全成功,要么全失败。
C - 一致性(Consistency)
核心:事务执行前后,数据库的数据状态必须是合法、一致的。
I - 隔离性(Isolation)
核心:多个事务同时执行时,它们之间互相隔离,互不干扰。
D - 持久性(Durability)
核心:事务一旦提交成功,数据就永久保存,不会因为数据库崩溃、断电等问题丢失。
MyISAM:是MySQL另一种场景的存储引擎,有较小的存储空间和内存消耗,并不支持ACID事务、外键约束、行级锁等特性,适用于需要读较多的场景,但在并发写入和数据完整性有一定限制
MeMory:把数据存储在内存中,适用于对读性能要求较高的场景,也不支持ACID等特性,并且在服务器重启或崩溃的时候会出现数据丢失
注意InnoDB和MyISAM 与 MeMory不同的是后者是把数据存储在内存,所以可以适用高性能场景
mysql为什么InnoDB是默认引擎?
因为InnoDB有ACID事务支持并且在崩溃恢复和并发性能方面都有不错的能力
事务:InnoDB有ACID(原子性、一致性、隔离性、持久性)事务支持,MyISAM没有
崩溃恢复:InnoDB有redo log日志可以恢复因崩溃而丢失的数据,MyISAM没有
并发性能:InnoDB有行级锁,锁的粒度小,只需要锁住一行,而MyISAM是表锁,锁必须锁住整个表粒度大
并且如果用MyISAM的话,因其使用非聚簇索引的原因,如果发生了数据的修改,那么对应的数据地址也要修改,对性能消耗比较大,而InnoDB只需要对修改的数据排序就行
mysql的InnoDB与MyISAM的区别
事务:InnoDB有事务ACID,MyISAM没有
锁粒度:前者是行锁,粒度小,后者是表锁粒度大
索引结构:InnoDB是聚簇索引(主键索引),只在叶子节点保存了整行数据,其余节点只存储主键值和指针,这样的设计可以让B+Tree的存储数据量增加,只是InnoDB在使用聚簇索引时,辅助索引就只能查到对应的主键值,然后再在主键索引里查询对应的整行数据。MyISAM是非聚簇索引,可以通过辅助键索引和主键索引一起,直接查到数据
count的效率:前者select count(*) from 需要全表扫描才能获取到整个count,但后者用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可
