1. 面试总结3
1.1. java类加载过程是怎么样的
加载->验证->准备->解析->初始化->使用->卸载
1.1.1. 说一下volatile
保证内存可见性与禁止指令重排序
使用缓存一致性协议保证内存可见性,当CPU对变量进行写操作时发现,变量是共享变量,那么就会通知其他CPU中将该变量的缓存行设置为无效状态。 当其他CPU在操作变量时发现此变量在的缓存行已经无效,那么就会去主内存中重新读取最新的变量,通过嗅探总线传播数据。
使用内存屏障禁止指令重排序
1.2. 数据库慢查询优化了解哪些
建索引的几大原则:
- 最左前缀匹配原则:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配
- =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序
- 尽量选择区分度高的列作为索引。
- 索引列不能参与计算,保持列“干净 ,函数不走索引
- 尽量的扩展索引,不要新建索引
慢查询优化步骤:
- 先运行看看是否真的很慢,注意设置SQL_NO_CACHE
- where条件单表查,锁定最小返回记录表,这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高,找出区分度最高的字段。
- explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
- order by limit 形式的sql语句让排序的表优先查
- 了解业务方使用场景
- 加索引时参照建索引的几大原则
- 观察结果,不符合预期继续从0分析