职场面试题总结(53)---MySQL如何查询索引是否命中、自己如何写一个函数式接口、Sentianl 服务熔断和服务降解

136 阅读4分钟

1、MySQL如何查询索引是否命中

1、explain查看sql语句的信息

explain sql语句可以分析sql语句的执行逻辑、顺序,以及是否使用索引、对记录进行操作时扫描的行数等信息。

2、Explain参数

参数1:table:表名 参数2:id:在一个大的查询语句中每个select关键字都对应一个唯一的id 参数3:select_type:SELECT关键字对应查询的类型,确定小查询在整个大查询中扮演了一个什么角色 参数4:partition(略):匹配的分区信息 参数5:type:针对单表的访问方法 参数6:possible_keys和key:可能用到的索引 和 实际上使用的索引 参数7:key_len:实际使用到的索引长度(即:字节数),帮你检查是否充分的利用上了索引当前key长度值越大越好(主要针对于联合索引,有一定的参考意义) 参数8:ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息(比如只是一个常数或者是某个列) 参数9:rows:预估的需要读取的记录条数(值越小越好) 参数10:filtered: 某个表经过搜索条件过滤后剩余记录条数的百分比 参数11:Extra:一些额外的信息,更准确的理解MySQL到底将如何执行给定的查询语句

2、自己如何写一个函数式接口

1、Java中重要的函数接口 在这里插入图片描述

2、函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 @FunctionalInterface注解 在Java8版本中引入了@FunctionalInterface函数式接口进行校验,用来检验我们所编写的接口是否有且只有一个抽象方法,例如:

@FunctionalInterface
public interface MyFunctionalInterface(){
	void method();
}

3、实现函数式接口的集中方法 1、外部类 2、静态内部类 3、局部内部类 4、匿名内部类 5、lambda表达式实现

//接口
interface ILove{
    void love(int a);
}
//外部类
class Love implements ILove{
    @Override
    public void love(int a) {
        System.out.println("用外部类实现接口");
        System.out.println("I Love You==>" + a);
    }
}
public class Lambda {
    //静态内部类
    static class Love1 implements ILove {
        @Override
        public void love(int a) {
            System.out.println("用静态内部类实现接口");
            System.out.println("I Love You==>" + a);
        }
    }

    public static void main(String[] args) {
        //局部内部类
        class Love2 implements ILove{
            @Override
            public void love(int a) {
                System.out.println("用局部内部类实现接口");
                System.out.println("I Love You==>" + a);
            }
        }
        new Love().love(1);
        new Love1().love(2);
        new Love2().love(3);
        //匿名内部类
        new ILove() {
            @Override
            public void love(int a) {
                System.out.println("用匿名内部类实现接口");
                System.out.println("I Love You==>" + a);
            }
        }.love(4);
        //lambda表达式
        System.out.println("用lambda实现接口");
        ILove love=a -> System.out.println("I Love You==>" + a);
        love.love(5);
        System.out.println("注意:lambda只能实现函数式接口");
    }

}

3、Sentianl 服务熔断和服务降解

限流: 限制并发的请求访问量,超过阈值则拒绝; 降级: 服务分优先级,牺牲非核心服务(不可用),保证核心服务稳定;从整体负荷考虑; 熔断: 依赖的下游服务故障触发熔断,避免引发本系统崩溃;系统自动执行和恢复

4、springboot 自动配置怎么实现

springboot启动时,会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,XxxxAutoConfiguration加载的时候会将全局配置application.properties或application.yml中的配置绑定到XxxxProperties类中(没有配置的属性将使用默认配置),注入到spring的ioc容器中。

5、Redission实现原理

在这里插入图片描述

6、B树和B+树的区别

1、B树

1、这里的 B 是 Balance(平衡)的缩写。它是一种多路的平衡搜索树。 2、它跟普通的平衡二叉树的不同是,B树的每个节点可以存储多个数据,而且每个节点不止有两个子节点,最多可以有上千个子节点。 3、B树中每个节点都存放着索引和数据,数据遍布整个树结构,搜索可能在非叶子节点结束,最好的情况是O(1)。 4、一般一棵 B 树的高度在 3 层左右,3 层就可满足 百万级别的数据量。

2、B+树

1、叶子节点保存了完整的索引和数据,而非叶子节点只保存索引值,因此它的查询时间固定为 log(n). 2、叶子节点中有指向下一个叶子节点的指针,叶子节点类似于一个单链表 正因为叶子节点保存了完整的数据以及有指针作为连接,B+树可以增加了区间访问性,提高了范围查询,而B树的范围查询相对较差 3、B+树更适合外部存储。因为它的非叶子节点不存储数据,只保存索引。