11.简述数据库执行查询请求的过程?
客户端请求:建立TCP连接。 使用连接器进行连接管理:此时服务端会对客户端发来数据携带的主机信息、用户名、密码等信息进行验证,如果认证失败就会拒绝连接。(连接器) 注: 当客户端连接服务端进程后,服务端进程会为其创建进程专门用于交互,当断开连接后,服务端不会立即进行销毁,而是会进行缓存,用于下次新的连接,这样可以不用频繁的创建和销毁线程,节省开销。 缓存查询:服务端会对之前的请求结果进行缓存,若存在缓存直接返回,否则继续执行下一步。维护缓存的代价较大,因此在8.0版本后已删除缓存。 语法解析:由于目前为止还未对文本解析,此时会对文本进行词法分析、语法分析、语义分析等过程,真正开始解析。(分析器) 查询优化:主要对执行的sql优化选择最优的执行方案。(优化器) 存储引擎:执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口。然后去引擎层获取数据返回,若开启查询缓存则会缓存查询结果。(执行器)
12.简述脏读、幻读、不可重复读的定义?
脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。 不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事务内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。 幻读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读。(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)
13.简述数据库的隔离级别?
读未提交:指一个事务读取另一个事务未提交的修改。,会发生脏读、不可重复读、幻读。 读提交:指只能读到已经提交的内容。会发生不可重复读和幻读。是SQL Server和Oracle的默认隔离级别。 可重复读:指当数据被读取时,不可进行update操作,保证多次读取的记录是相同的,解决了不可重复读的问题。但幻读是insert导致,不会避免。可重复读是MySQL的默认隔离级别。 可串行化读:这是数据库最高的隔离级别,这种级别下,事务“串行化顺序执行”,也就是一个一个排队执行。这种级别下,“脏读”、“不可重复读”、“幻读”都可以被避免,但是执行效率奇差,性能开销也最大,所以基本没人会用。
14.简述MySQL可以从哪些方面做到性能优化?
为搜索字段创建索引。 避免使用 Select *,列出需要查询的字段。 垂直分割分表,水平分割是分割记录,以一条记录/行为单位。垂直分割则是以列为单位,将列分割出去。 选择正确的搜索引擎。 实现数据库的主从同步,实现读写分离。 添加合适的缓存机制,维护代价高。 对冷热数据进行均分,减少单个库的压力,使整体性能达到更优。
15.简ySQL为什么需要事务回滚机制?
在MySQL中事务回滚通过日志完成,所有事务进行的修改都会先记录到回滚日志中,然后再对数据库中的对应行进行写入。当事务被提交后就无法回滚了。
回滚日志的作用:
能够在发生错误或用户执行rollback时提供回滚的相关信息。 在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。