1.哪些情况不要创建索引
哪些情况不要创建索引 1)表记录太少 300万数据时MySQL性能就开始下降了,这时就可以开始开始优化了 2)经常增删改的表 提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。 因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件 3)where条件里用不到的字段不创建索引
2.最左匹配原则
过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。同时遇到范围查询(>、<、between、like)就会停止匹配。
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) 事务的隔离性是指一个事务的执行 不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对 并发 的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 持久性(durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。 持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。
7.隔离级别,RR和RC的区别
读未提交之脏读 对于两个事务 Session A、Session B,**Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。**之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效的
读已提交之不可重复读 在事务2中commit,事务1没有commit读到了事务2提交的数据(不可重复读) 可重复读 不可重复读和脏读都没有问题 可重复读出现幻读的现象
8.对于时间复杂度是怎么理解和怎么计算
时间复杂度为一个算法流程中,常数操作数量的一个指标。常用0(读作big 0)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。 在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那么时间复杂度为0(f(N))。 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”。
9.快排说一下,复杂度怎么计算的,快排的底层思想是啥?
最好时间复杂度为O(logN),最坏时间复杂度O(n^2) 用Mater公式计算 如果打的比较正的话在中间的位置,那么就是2*T(N/2)+(N) (d为额外的时间复杂度) 可以看出是第三个 如果打偏一直在最后一个位置,那么就是O(n^2) 快速排序的思想是基于分治算法。
分解:分解原问题为结构相同的子问题(即寻找子问题)
解决:当分解到容易求解的边界后,进行递归求解
合并:将子问题的解合并成原问题的解
10.TCP”三握四挥“的过程
TCP 是一个双工协议,为了让双方都保证,建立连接的时候,连接双方都需要向对方发送 SYC(同步请求)和 ACK(响应)。 握手阶段双方都没有烦琐的工作,因此一方向另一方发起同步(SYN)之后,另一方可以将自己的 ACK 和 SYN 打包作为一条消息回复,因此是 3 次握手——需要 3 次数据传输。 到了挥手阶段,双方都可能有未完成的工作。收到挥手请求的一方,必须马上响应(ACK),表示接收到了挥手请求。类比现实世界中,你收到一个 Offer,出于礼貌你先回复考虑一下,然后思考一段时间再回复 HR 最后的结果。最后等所有工作结束,再发送请求中断连接(FIN),因此是 4 次挥手。
11.ThreadLocal讲一下,实现原理,使用的时候有什么需要注意的
ThreadLocal的实现原理是每一个Thread维护一个ThreadLocalMap映射表,映射表的key是ThreadLocal实例,并且使用的是ThreadLocal的弱引用 ,value是具体需要存储的Object。下面用一张图展示这些对象之间的引用关系,实心箭头表示强引用,空心箭头表示弱引用。 注意:内存泄漏 弱引用,只要发生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内存泄漏就值得我们小心 set、get、remove方法会去检查所有键为null的Entry对象
|