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

高级开发工程师面试题-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:全表扫描 没走索引

猜你喜欢

转载自blog.csdn.net/GSl0408/article/details/130647595