JAVA高级开发工程师面试题2023

文章讨论了InnoDB存储引擎的行溢出机制,MySQL的写失效问题及其双写缓冲区解决方案,Hash索引的优缺点,以及慢查询的优化方法,包括分页查询的优化策略。重点在于理解数据库内部工作原理和提高查询效率。
摘要由CSDN通过智能技术生成

高级开发工程师面试题-Xuan

1、InnoDB行溢出

所谓的行溢出 其实可以理解为是页溢出 之所以会导致行溢出 是因为存储数据中的可变长度类型字段:例如varChar和Text 在超过InnoDB规定的16KB时候 会产生一个溢出页 溢出部门的字节数据将存储在溢出页 在原来的叶子节点则会空出一个2KB左右的大小 存储一个地址值 指向溢出页 从而让数据可以完美的连接起来

2、Mysql写失效

首先提一下 Mysql中的一页数据为16KB 但是系统的页一页只有4KB 所谓的写失效 是因为在Mysql写入到系统磁盘的这么一个过程中 16KB的数据需要分为4份去写 在4份写完之前 如果数据库宕机 则会导致写失效    《解决方案》:双写缓冲区:InnoDB实现了DoubleWrite Buffer 让需要写入的数据首先到达双写缓冲区 如果在此期间数据库宕机 下次重启的时候会先从双写缓冲区执行 从而保证不会产生写失效

3、Hash索引的优缺点

InnoDB默认使用的是B+Tree索引 但是也提供了一个特殊的Hash索引 它会去监控索引表 如果监控到有一个索引经常被使用的话 则标记为热数据 InnoDB会在内存中创建一个自适应Hash索引 如果下次再查询这个数据的话 InnoDB会通过Hash算法算出哈希码值 因为存储的是KeyValue的形式 所以可以一次性直接查询出来所有需要的数据 避免了通过B+Tree索引多次的节点扫描 提高了查询的效率

《优点》因为索引自身需要存储Hash值 所以索引结构很紧凑 做等值查询而不是范围查询 效率也很快

《缺点》只支持等值查询 而不支持范围查询 因为Hash索引不是通过创建时间存储的 所以没排序

4、慢查询优化

通过开启show_query_log(但是开启后会对Mysql性能有所消耗)

show_query_log_file(慢查询日志地址)

log_query_time(慢查询规定时间阀值 超过此时间才记录到日志)

日志中的信息有:执行时间、用户信息、查询时长、等待锁的时长、查询结果行数、扫描的行数、SQL记录

《性能慢的原因》:等待的时间长、执行的时间长

《优化思路》

筛选出高并发或者使用率高的慢查询SQL进行优化

定位优化对象的瓶颈(IO优化、CPU优化、网络带宽优化)

通过Explain进程索引勘探

在循环中减少数据库IO操作

减少无用的列查询 和where条件

避免JOIN查询和子查询

5、分页查询优化

普通的分页查询可能就是

Select * from 表 limit 0,100

使用索引情况下

Select * from 表 where id >1000 limit 100

利用子查询

Select * from 表 where(Select id from 表 where id > 100) limit 100

索引查询时常见的值

System、const、eq_ref、ref、range、index、ALL

System:不走数据库IO直接拿到数据

Const:一次性拿出所有的查询数据,主要出现聚集索引

Eq_ref:查找唯一索引,返回数据最多一条

Ref:查找非唯一索引,返回多条数据

Range:查询某个索引的部分索引,只检索范围查询

Index:查找所有的索引树 因为索引文件比数据文件小

ALL:全表扫描 没走索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG-0408

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值