MySQ数据库

1.说说MySQL的基础架构

MySQ数据库

 

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 目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。

 

MySQ数据库

上一篇:sqlserver 转 postgresql


下一篇:MySQL数据库的函数的使用:使用字符串拼接函数实现MySQL查询结果的拼接