1.说说MySQL的基础架构
Mysql的逻辑架构主要分为三层:
(1)第一层负责连接处理,授权认证,安全等
(2)第二层负责编译并优化SQL
(3)第三层是存储引擎
2.说说一条SQL语句的执行流程
Mysql大致分为 Server层 和 存储引擎层 两部分
Server层:
连接器:TCP握手后服务器来验证登陆用户身份,A用户创建连接后,管理员对A用户权限修改了也不会影响到已经创建的连接权限,必须重新登陆。
查询缓存:查询后结果存储在缓存,8.0版本后已经取消,因为查询缓存失效太频繁,得不偿失。
分析器:根据语法规则,判断输入的这个SQL语句是否满足 Mysql 语法。
优化器:多种执行策略可实现目标,系统自动选择最优进行执行。
执行器:判断是否有权限,将最终任务提交到存储引擎。
存储引擎层:
负责数据的存储和提取。其架构模式是插件式的,支持 InnonDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是 InnonDB。5.5.5 版本开始成为默认存储引擎。
3.一条SQL查询语句在MYSQL中如何执行?
先检查语句 是否有权限,如果没有权限,直接返回错误信息,如果有权限会先查询缓存。
如果没有缓存,分析器进行 词法分析,提取sql语句中的关键元素,判断sql语句是否有语法错误,比如关键词是否正确等等。
最后优化器确定执行方案进行权限校验,如果没有权限就直接返回错误信息,如果有权限就会 调用数据库引擎接口,返回执行结果。
事务
1.什么是事务
事务内的语句,要么全部执行成功,要么全部执行失败
2.事务的四大特性及其实现原理(ACID)
ACID表示 原子性、一致性、隔离性、持久性,一个运行良好的事务处理系统必须具备这些标准特征
原子性:事务作为一个整体被执行,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。
一致性:指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
隔离性:多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。
持久性:一旦事务提交,则其所作的修改就会永久保存到数据库中。即使系统崩溃,修改的数据也不会丢失。
3.事务的四种隔离级别?MySQL的默认隔离级别是什么?
未提交读(READ UNCOMMITTED) :别人改数据的事务尚未提交,我在我的事务中也能读到。
提交读(READ COMMITTED):别人改数据的事务已经提交,我在我的事务中才能读到
可重复读 (REPEATABLE READ):别人改数据的事务已经提交,我在我的事务中也不去读,以此保证重复读一致性
可串行化(SERIALIZABLE):我的事务尚未提交,别人就别想改数据
可重复读是 MYSQL的默认事务隔离级别
4.事务操作可能会出现的数据问题(即脏读、不可重复读、幻读、可重复读)
脏读:事务A、B交替执行,B事务更改数据还未提交,A事务已经看到并且用了。B事务如果回滚,则A事务用错了数据,这就是脏读。
不可重复读:在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。
幻读:事务A先修改了某个表的所有记录的状态字段为 已处理,未提交;事务B也在此时新增了一条未处理的记录,并提交了;事务A随后查询记录,却发现有一条记录是未处理的造成幻读现象,幻读仅 专指新插入的行。幻读会造成语义上的问题跟数据一致性问题。
可重复读:在可重复读 RR隔离级别下,普通查询是 快照读,是不会看到别的事务插入的数据的。因此,幻读在当前读下才会出现。要用 间隙锁 解决此问题。
隔离级别越严实,效率就会越低。
MySQL InnDB 默认为 RR级别,但是不会出现幻读。因为当事务A更新了的所有记录的某个字段,此时事务A会获得对这个表的表锁,因为事务A还没有提交,所以事务A获得的锁没有释放,此时事务B在该表插入新记录,会因为无法获得该表的锁,则导致插入操作被阻塞。只有事务 A提交了事务后,释放了锁,事务B才能进行接下去的操作。所以可以说 MYSQL 的RR级别的隔离是已经实现解决了脏读、不可重复读和幻读的。
锁
1.什么是死锁,死锁是怎么产生的,解决方案,死锁竞争的是什么资源
死锁是指两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。多个事务同时锁定同一个资源时,也会产生死锁。
为解决死锁问题,数据库系统实现了各种死锁检测和死锁超时机制。InnoDB 存储引擎,能检测到死锁的循环依赖,并立即返回一个错误。
另一种解决方式,就是当查询的时间达到锁等待超时的设定后放弃锁请求,这种方式通常来说不太好。InnoDB 目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。