Java中常见面试题一(艰难)

Redis的缓存击穿及解决方案
  • 缓存击穿:
    这个跟缓存雪崩有点像,然而又有一点不一样,缓存雪崩是因为大面积的缓存生效,数据库解体了,而缓存击穿不同的是缓存击穿是指存在一个热点数据Key,有申请一直来拜访这个Key,这么多申请在同一段时间内拜访这个热点数据,当这个 Key 生效工夫到了的时候,继续的这么多申请间接怂到数据库上了,就在这个 Key 值上击穿了缓存。
  • 解决方案:
    设置热点数据永不过期或者加上互斥锁就搞定了。
索引的建设准则, 如何防止索引生效
  • 索引的建设准则
    索引的设计须要遵循一些已有的准则,这样便于晋升索引的应用效率,更高效的应用索引。
    (1)对查问频次较高,且数据量比拟大的表,建设索引。
    (2)索引字段的抉择,最佳候选列该当从where子句的条件中提取,如果where子句中的组合比拟多,那么该当筛选最罕用,过滤成果最好的列的组合。
    (3)如果where后有多个条件常常被用到,倡议建设合乎索引,复合索引须要遵循最左前缀法令,N个列组合而成的复合索引,相当于创立了N个索引。
    复合索引命名规定index_表名_列名1_列名2_列明3
    比方:createindexidx_seller_name_sta_addrontb_seller(name,status,address)
    复合索引须要遵循最左前缀法令,N个列组合而成的复合索引,相当于创立了N个索引。最左前缀法令前面会具体介绍~
    (4)应用惟一索引,区分度越高,应用索引的效率越高。
    (5)索引并非越多越好,如果该表赠,删,改操作较多,谨慎抉择建设索引,过多索引会升高表保护效率。
    (6)应用短索引,进步索引拜访时的I/O效率,因而也相应晋升了Mysql查问效率。
    (7)多表连贯的字段上须要建设索引,这样能够极大进步表连贯的效率。
    (8)排序字段上,因为排序效率低,增加索引能进步查问效率。
  • 如何防止索引生效
    (1)遵循最左前缀法令
    如果在查问的时候,应用了复合索引,要遵循最左前缀法令,也就是查问从索引的最左列开始,并且不能跳过索引中的列。如果不蕴含最右边的索引列,则其余索引不失效;如果蕴含了最右边的索引列,然而跳过了一列间接索引了复合索引的第三列,则第三列的索引不失效。
    (2)不要在索引上应用运算,否则索引也会生效。
    (3)字符串不加引号,造成索引生效。
    (4)尽量应用笼罩索引,防止select*,这样能进步查问效率。
    (5)or关键字连贯
    用or宰割开的条件,如果or后面的列有索引,or前面的列没有索引,那么查问的时候索引会生效,如果肯定要用or查问,能够思考下or连贯的条件列都加索引,这样就不会生效了。
    (6)like含糊查问
    在应用like含糊查问时,如果like%也就是%加在前面索引不会生效,如果%lik或%like%也就是%加在后面,索引会生效。
    如果查问的列占整张表的绝大多数,那么就会全表扫描,不会走索引。所以在查问的时候走不走索引不能百分百必定。
    也就是说如果查找一个罕见数据,如果建设了索引,就会走索引。如果查问的数据表白绝大多数都符合条件,就全表扫描,不走索引。