今日头条面试真实分享,这些题必须得看

275 阅读3分钟

今日头条面试题

作者:Lucas
关注我,学习更多Java相关知识。领取更多Java资料

1.mysql为什么要用b+树,不用平衡二叉树做索引结构?

  • B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了
  • 范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。

2.创建数据库索引应该怎么考虑?

  • 索引字段如果是CHAR或者VARCHAR时,索引的length可以小于字段的实际长度。但是如果字段的类型是BLOB和TEXT时,必须指定length。
  • 经常与其他表链接的表,在链接字段应创建索引 on 两边的字段,都要建立索引
  • 经常出现在where子句中的字段,尤其是大表,应创建索引 -对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引 -应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,我们可以给存在字段默认值使其能够查询的时候命中索引。例如:where number is null 应使用:where number = 0,其中0则是number的默认值。也就是null值得替代者
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描 -应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

3.使用int 做primary key和使用string 有什么优劣?

  • int 相比varchar、char、text使用更少的存储空间,而且数据类型简单,可以节约CPU的开销,更便于表结构的维护 -默认都会在主键上建立主键索引,使用整形作为主键可以将更多的索引载入内存,提高查询性能 -对于InnoDB存储引擎而言,每个二级索引都会使用主键作为索引值的后缀,使用自增主键可以减少索引的长度(大小),方便更多的索引数据载入内存 -可以使索引数据更加紧凑,在数据插入、删除、更新时可以做到索引数据尽可能少的移动、分裂页,减少碎片的产生(可以通过optimize table 来重建表),减少维护开销
    -在数据插入时,可以保证逻辑相邻的元素物理也相邻,便于范围查找

** PS: 高并发情况下使用自增Int,有可能造成锁的争用问题 **

4.假如一个业务依赖单点redis,此redis故障将导致业务不可用,如何改进

5.微服务,A服务请求B服务B1接口,B1接口又请求A服务A2接口。会不会有问题?

6.如何预估一个mysql语句的性能?

7.close wait和time wait是什么?如何排查?有什么意义?

8. http req和resp的中数据有哪些

9.什么是连接的半打开,半关闭状态

10.如何保证redis和数据库数据的一致性。比如用户名既保存在数据库,又保存在redis做缓存。有如下操作update_db(username); update_redis(username)。但是执行update_db后故障,update_redis没有执行。有什么简单办法解决这个问题。