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