京东数科Java一面面经

1.哪些情况不要创建索引

哪些情况不要创建索引
1)表记录太少
300万数据时MySQL性能就开始下降了,这时就可以开始开始优化了
2)经常增删改的表
提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。
因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件
3)where条件里用不到的字段不创建索引

2.最左匹配原则

过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。同时遇到范围查询(>、<、between、like)就会停止匹配。
京东数科Java一面面经_第1张图片

3.包含 order by 和 group by 的sql语句,应该怎么使用索引

order by

无过滤 不索引
顺序错,必排序
方向反 必排序

ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
group by
group by 先排序再分组,遵照索引建的最佳左前缀法则
当无法使用索引列,增大max_length_for_sort_data和sort_buffer_size参数的设置
where高于having,能写在where限定的条件就不要写在having中了
group by没有过滤条件,也可以用上索引。Order By 必须有过滤条件才能使用上索引。

4.场景题:where name=“张三” order by age;应该怎样建立索引

index(name,age)

5.where name=“张三” or class=1 order by age;:结合索引应该怎么优

index(name,class,age)

6.数据库事务特性,分别是什么意思

ACID
原子性(atomicity)
原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。
一致性(consistency)
根据定义,一致性是指事务执行前后,数据从一个 合法性状态 变换到另外一个 合法性状态 。这种状态是 语义上 的而不是语法上的,跟具体的业务有关。
在这里插入图片描述
隔离型(isolation)
事务的隔离性是指一个事务的执行 不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
京东数科Java一面面经_第2张图片
持久性(durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。
持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。

7.隔离级别,RR和RC的区别

京东数科Java一面面经_第3张图片
京东数科Java一面面经_第4张图片
读未提交之脏读
对于两个事务 Session A、Session B,**Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。**之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效的
京东数科Java一面面经_第5张图片

读已提交之不可重复读
在事务2中commit,事务1没有commit读到了事务2提交的数据(不可重复读)
京东数科Java一面面经_第6张图片
可重复读
不可重复读和脏读都没有问题
京东数科Java一面面经_第7张图片
可重复读出现幻读的现象
京东数科Java一面面经_第8张图片

8.对于时间复杂度是怎么理解和怎么计算

时间复杂度为一个算法流程中,常数操作数量的一个指标。常用0(读作big 0)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。
在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那么时间复杂度为0(f(N))。
评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。

9.快排说一下,复杂度怎么计算的,快排的底层思想是啥?

最好时间复杂度为O(logN),最坏时间复杂度O(n^2)
用Mater公式计算
在这里插入图片描述
如果打的比较正的话在中间的位置,那么就是2*T(N/2)+(N) (d为额外的时间复杂度)
可以看出是第三个
京东数科Java一面面经_第9张图片
如果打偏一直在最后一个位置,那么就是O(n^2)
快速排序的思想是基于分治算法。

分解:分解原问题为结构相同的子问题(即寻找子问题)
解决:当分解到容易求解的边界后,进行递归求解
合并:将子问题的解合并成原问题的解

10.TCP”三握四挥“的过程

TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC(同步请求)和 ACK(响应)。
握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输。
到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 Offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。
京东数科Java一面面经_第10张图片

京东数科Java一面面经_第11张图片

11.ThreadLocal讲一下,实现原理,使用的时候有什么需要注意的

ThreadLocal的实现原理是每一个Thread维护一个ThreadLocalMap映射表,映射表的key是ThreadLocal实例,并且使用的是ThreadLocal的弱引用 ,value是具体需要存储的Object。下面用一张图展示这些对象之间的引用关系,实心箭头表示强引用,空心箭头表示弱引用。
京东数科Java一面面经_第12张图片
注意:内存泄漏
弱引用,只要发生gc就会回收,但是会出现一个问题
1.ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。
2.当然,如果当前thread运行结束,threadLocal,threadLocalMap,Entry没有引用链可达,在垃圾回收的时候都会被系统进行回收。
3 但在实际使用中 我们有时候会用线程池 去维护我们的线程,比如在Executors.newFixedThreadPool()时创建线程的时候,为了复用线程是不会结束的,所以threadLocal内存泄漏就值得我们小心
京东数科Java一面面经_第13张图片
set、get、remove方法会去检查所有键为null的Entry对象

你可能感兴趣的