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% 也就是 % 加在后面,索引会生效。
如果查问的列占整张表的绝大多数,那么就会全表扫描,不会走索引。所以在查问的时候走不走索引不能百分百必定。
也就是说如果查找一个罕见数据,如果建设了索引,就会走索引。如果查问的数据表白绝大多数都符合条件,就全表扫描,不走索引。