Java1面试常见题(难)Redis缓存击穿及解决办法缓存击穿:这个有点像缓存雪崩,但又有一点不同。缓存雪崩是由于大面积的缓存失效导致数据库崩溃。和cachebreakdown的区别在于,cachebreakdown是指存在一个热点数据key。有持续访问此密钥的请求。那么多的请求在同一时间段内访问这个热点数据。当key过期后,那么多连续的请求直接发到数据库,缓存就在key值上坏掉了。解决方法:设置热点数据永不过期或者加个互斥量即可。索引建立原则,如何避免索引失败索引建立原则索引的设计需要遵循一些已有的原则,以提高索引的使用效率,更高效地使用索引。(1)为查询频率高、数据量大的表创建索引。(2)对于索引字段的选择,应该从where子句的条件中提取最佳候选列。如果where子句中有很多组合,那么应该选择过滤效果最好的最常用列的组合。(3)如果where后面经常使用多个条件,建议创建匹配索引。复合索引需要遵循最左前缀规则。一个由N列组成的复合索引,相当于创建了N个索引。复合索引命名规则index_tablename_columnname1_columnname2_list3例如: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连接的条件列全部建立索引,这样就不会失效。(6)like模糊查询使用like模糊查询时,如果like%是%加在后面,则索引不会失效,如果%lik或%like%是%加在前面,则索引无效。如果查询的列占整个表的绝大部分,那么会扫描整个表,不使用索引。因此,查询时是否使用索引并不能100%确定。也就是说,如果你要找一个稀有的数据,如果建立了索引,就取索引。如果查询到的数据表达式大部分满足条件,则不使用索引扫描全表。
