Java面试题———MySql篇③

目录

1.查询语句执行流程

2.、索引的数据结构是什么

3.、数据库中的锁有哪些

4.、MySQL日志类型


1.查询语句执行流程

一条查询语句到达MySQL数据库之后,数据库中的各个组件会按照顺序执行自己的任务

  1. 首先是连接器,他会负责建立连接、检查权限等操作

  2. 连接成功之后,会查询缓存,如果缓存中有结果会直接返回;如果缓存中没有结果,会将sql交给分析器处理

  3. 分析器负责检查sql的词法、语法,如果没有问题,再将sql交给优化器处理

  4. 优化器会决定用哪个索引,决定表的连接顺序等,然后将优化之后的sql交给执行器

  5. 执行器根据存储引擎类型,调用存储引擎接口

  6. 存储引擎负责最后数据的读写

2.、索引的数据结构是什么

在MySQL中索引使用的数据结构是B+Tree,B+树是基于B树的变种,它具有B树的平衡性,而且树的高度更低

  • B+树非叶子节点不存在数据只存索引,因此其内部节点相对B树更小,树的高度更小,查询产生的I/O更少

  • B+树查询效率更高,B+树使用双向链表串连所有叶子节点,区间查询效率更高

  • B+树查询效率更稳定,B+树每次都必须查询到叶子节点才能找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定

3.、数据库中的锁有哪些

MySQL中的锁从不同维度可以分为不同的种类

  1. 从锁的粒度上可以分为表锁和行锁

    表锁指的是会锁定修改数据所在的整个表,开销小,加锁快,锁定粒度大,发生锁冲突概率高

    行锁指的是会锁定修改数据所在的行记录,开销大,加锁慢,锁定粒度小,发生锁冲突概率低

  2. 从锁的排他性上分为共享锁和排他锁

    共享锁指的是当一个事务针对同一份数据加上共享锁之后,另一个事务也可以再往上加一把共享锁,也可以读数据,但是不能改

    对索引列加共享锁,锁定的是一行数据;对非索引列加共享锁,锁定的是整表数据

    排他锁指的的是当一个事务针对同一份数据加上排他锁之后,另一个事务只能读数据,不能改,也不能再上其它任务锁

  3. 还有两种概念上的锁是悲观锁和乐观锁

    悲观锁是指一个事务在修改数据的时候,总是认为别人也会修改此数据,所以强制要使用锁来保证数据安全

    乐观锁是指一个事务在修改数据的时候,总是认为别人不会修改此数据,因为不加任何锁

    这种情况下万一在当前事务修改的时候,数据被其它事务也修改了,机会出现问题,此时常用的方案是:

    给数据表中添加一个version列,每次更新后都将这个列的值加1,读取数据时,将版本号读取出来

    在执行更新的时候,会先比较版本号,如果相同则执行更新,如果不相同,说明此条数据已经发生了变化,就放弃更新或重试

4.、MySQL日志类型

MySQL的很多功能都是依靠日志来实现的,比如事务回滚,数据备份,主从复制等等,常见的日志有下面几个

  1. binlog归档日志

    负责记录对数据库的写操作,一般用在主从复制过程中记录日志,从库拷贝此日志做重放实现数据同步

  2. redolog重做日志

    用于确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘

    在重启 mysql 服务的时候,根据 redo log 进行重做,从而达到事务的持久性这一特性

  3. undo log 回滚日志

    保存了事务发生之前的数据的一个版本,可以用于回滚

相关推荐
秋の花几秒前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端3 分钟前
第六章 7.0 LinkList
java·开发语言·网络
Wx-bishekaifayuan10 分钟前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer0814 分钟前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
全栈开发圈16 分钟前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
WaaTong19 分钟前
《重学Java设计模式》之 单例模式
java·单例模式·设计模式
面试鸭21 分钟前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展
stars_User1 小时前
MySQL数据库面试题(下)
数据库·mysql
沈询-阿里1 小时前
java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
java·开发语言