面试题总结

本文探讨了索引失效的常见原因、SQL操作优化,如数字转换和不等查询,以及事务传播的不同策略。同时,深入讲解了Spring Boot中常用的注解及其作用,以及MyISAM与InnoDB引擎的性能对比。

*** 索引失效情况

1 字段添加函数、计算操作
2 数字隐式转换 如varchar不加单引号的话可能会自动转换为int型
3 不等查询
4 当全表扫描用时少于索引用时[一般查询数据大于总量的30%的时候就会不走索引了]
5 like 以%开头
6 联合索引没有遵循最左原则
7 or 联合查询字段没有全部建立索引
8 在索引列上使用 IS NULL 或 IS NOT NULL操作

*** 事务传播情况

1 PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

2 PROPAGATION_SUPPORTS 如果存在一个事务,则支持当前事务。如果没有事务则以非事务运行。

3 PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

4 PROPAGATION_REQUIRES_NEW 它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。

5 PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

6 PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常。

7 PROPAGATION_NESTED 外层事务失败会回滚内外层所有事务 内层事务失败即PROPAGATION_NESTED 事务失败 则只回滚内层事务
如果单独调用PROPAGATION_NESTED 方法,则按REQUIRED 第一种事务传播方式 执行

有 支持 没有 开启

有 支持 没有 没有

有 支持 没有 异常

直接开启 有 挂起

直接以非事务运行 有 挂起

直接以非事务运行 有 异常

*** 事务不受控制情况

编程式事务 在代码中显式的编写事务代码 缺点代码侵入严重

声明式事务 spring注解

1 如果你的数据库引擎不支持事务,再怎么使用事务注解也是没用的,就像MySQL的MyISAM引擎是没有事务的。

2 没有被spring管理的类 即使方法中使用了事务注解@Transactional 也是不被控制的

3 方法不是public的 因为jdk代理和cglib代理都无法代理private 方法 可以开启 AspectJ 代理模式

*** springboot常用注解

@springbootApplication

@Configuration

@EnableAutoConfiguration

@ComponentScan

*** select count(*) 和 select count(字段) 区别

count(字段) 不包含NULL

count(*)

  • MYISAM mysql进行了优化效率很高 MyISAM做了一个简单的优化,把表的总行数单独记录下来,
    如果执行count(*)时可以直接返回,前提是不能有where条件。MyISAM是表级锁,不会有并发的行操作,所以查到的结果是准确的。
  • InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,
    而非聚簇索引的叶子节点中保存的是该行记录的主键的值。MySQL会优先选择最小的非聚簇索引来扫表。
  • COUNT(1) 和 count(*) 优化是一样的

*** IO多路复用

*** JVM垃圾回收器都有哪些

  • 判断对象是否为垃圾的算法:a> 引用计数 【循环引用问题】 b> 可达分析

  • 垃圾回收算法:

    a> 标记清除 容易产生内存碎片

    b> 复制算法 对内存空间的使用做出了高昂的代价 opying算法的效率跟存活对象的数目多少有很大的关系,如果存活对象很多,那么Copying算法的效率将会大大降低

    c> 标记整理 完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存

    d> 分代收集 分为新生代和老年代 新生代分为1个Eden区 和 2个相同大小Surviver 新生代采用复制算法 eden和一个surviver 复制到另一个空闲的surviver中

             老年代采用 标记-整理 算法
    
  • 垃圾回收器:

-------------------------------↓↓↓↓以上为新生代回收器↓↓↓↓----------------------------------------

a> serial收集器 最基本发展时间最长 单线程 工作时其他全部运行代码停止 采用复制算法 

b> ParNew收集器 是serial收集器的多线程版本 工作时其他全部运行代码停止 复制算法

c> Parallel Scavenge 收集器 自动调节内存参数 达到吞吐量的最优 复制算法

-------------------------------↑↑↑↑以上为新生代回收器↑↑↑↑----------------------------------------

-------------------------------↓↓↓↓以上为新生代回收器↓↓↓↓----------------------------------------

d> Serial Old 收集器 单线程 工作在老年代 使用标记-整理 算法 


e> Parallel Old 多线程收集器 标记-整理 算法 

f> CMS收集器 并发收集、低停顿。先使用标记-清除算法 多少次后为了避免内存碎片 再使用复制算法

-------------------------------↑↑↑↑以上为新生代回收器↑↑↑↑----------------------------------------

`
g> G1收集器

	g.1> G1能充分利用多CPU、多核环境下的硬件优势,使用多个CPU来缩短Stop-The-World停顿时间
	
	g.2> 其他收集器的工作范围是整个新生代或者老年代、G1收集器的工作范围是整个Java堆


    JAVA 11 包含一个全新的垃圾收集器--ZGC,它由Oracle开发,承诺在数TB的堆上具有非常低的暂停时间。 JAVA 11 默认垃圾回收器是G1

*** JVM 内存模型

  • 程序计数器 线程私有 每个线程都有会有个程序计数器内存 记录着当前要执行的代码行号
  • 栈 每个方法在执行的时候也会创建一个栈帧,存储每个方法的局部变量 方法返回地址等
  • 堆 被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例
  • 方法区 被所有方法线程共享的一块内存区域。用于存储已经被虚拟机加载的类信息,常量,静态变量等。
  • 本地方法栈 线程私有 存放本地方法

*** mybatis ${}和#{}的区别

  • ${}是字符串拼接,不但’’ 条件查询时 字符串类型 需要手动拼接’'没有sql预编译 可以sql注入

  • #{}是占位符,自动添加’’ 执行语句经过预编译 可以防止sql注入

  • 查询语句表名为参数时和 order by字段为参数时 必须用${}传递

  • 不论是单个参数,还是多个参数,一律都建议使用注解@Param("")

*** redis 数据类型

string list set hash sort

*** 线程同步的几种方法

  • synchronized、volatile、原子类【CAS】、lock、容器类、【concurrentHashmap】、ThreadLocal

  • synchronized 锁升级
    1 无锁 锁对象初始化时 是无锁状态
    2 偏向锁 只有一个线程执行加锁代码 此时当前加锁对象的mark world中存储为偏向锁信息
    3 轻量级锁 多个线程执行加锁代码 但在每个线程执行加锁代码时 从没有发生过竞争 导致另一个线程自旋
    4 重量级锁 多个线程执行加锁代码 并出现线程自旋超时 就会升级为重量级锁

    锁只会自动升级 不会也不能降级

  • volatile 保证内存可见性 但不能保证原子性,保证指令重排序的一致性

  • 原子类 AtomicInteger等底层原理为 CAS 原子类会有ABA问题 可以用AtomicStampedReference 解决

  • 如果是 JDK8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观锁的重试次数)。
    使用AtomicLong时,在高并发下大量线程会同时去竞争更新同一个原子变量,但是由于同时只有一个线程的CAS会成功,
    所以其他线程会不断尝试自旋尝试CAS操作,这会浪费不少的CPU资源。而LongAdder可以概括成这样:内部核心数据value分离成一个数组(Cell),
    每个线程访问时,通过哈希等算法映射到其中一个数字进行计数,而最终的计数结果,则为这个数组的求和累加。简单来说就是将一个值分散成多个值,
    在并发的时候就可以分散压力,性能有所提高。

*** class文件装配过程

  • 加载 --> 连接 --> 初始化

         |  |
       |      |
     |          |
    

    验证–>准备–>解析

1> 加载

 将class字节码加载到jvm中 主动加载和被动加载  
 
 主动加载 : new、反射、初始化子类必先初始化父类 没动加载 不会执行初始化 子类调用父类的变量、final常量不会初始化

2> 连接

 2.1> 验证 : 格式检验【魔数、版本、长度检验】

 2.2> 准备 : 为类分配空间 变量设置为初始值 final常量初始化完成

 2.3> 解析 : 解析阶段的任务就是将类、接口、字段和方法的符号引用转为直接引用

3> 初始化

 初始化阶段的重要工作是执行类的初始化方法 它是由类静态成员的赋值语句以及static语句块合并产生的。父类的static块先于子类的static块

*** 类加载器分类和加载范围

  • 根类加载器 加载rt包下的class

  • 扩展类加载器 加载ext包下的class

  • 系统类加载器 加载用户写的class classpath下的class

  • JVM的类加载机制主要有如下3种

    1> 全盘负责制 所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。

    2> 双亲委派 则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类

    3> 缓存机制。缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,

    只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。

    这就是为什么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因

*** 为什么MyISAM比Innodb引擎查询快

  • MyISAM 插入、修改、删除没有事务 不需要维护行锁,不需要维护redo、undo log

  • MyISAM 索引记录的事数据地址引用 InnoDB 普通索引记录的是主键 需要二次回表查询

  • MyISAM 只会缓存索引不会缓存数据

  • MyISAM 索引开启了压缩索引【前缀压缩】 单位页查询数据更多 默认只压缩字符串 压缩索引的倒序扫描会更慢

*** Innodb引擎和MyISAM 引擎 存储文件分别是什么

  • Innodb 存储包含两个 frm文件【表空间】 IBD文件【主键和数据结合的聚簇索引】

  • MyISAM 包含三个文件 frm【表空间】 MYI [索引文件] MYD [数据文件]

*** mysql explain 分析过程

共10个分析项

  • id id值越大越先执行 相同值 按从上到下执行顺序

  • select_type

    1> simple 不带union或子查询的查询

    2> PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

    3> UNION(UNION中的第二个或后面的SELECT语句)

    4> SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

    5> DERIVED(派生表的SELECT, FROM子句的子查询)

  • table

    显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称

  • partitions

    使用分区的哪部分

  • type

    下面的类型 从上到下性能越来越好

    1> ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

    2> index: Full Index Scan,index与ALL区别为index类型只遍历索引树

    3> range:只检索给定范围的行,使用一个索引来选择行

    4> ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

    5> eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,

    就是多表连接中使用primary key或者 unique key作为关联条件

    6> const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,

    system是const类型的特例,当查询的表只有一行的情况下,使用system

    7> NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

  • possible_keys

    指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,

    但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

  • key

    key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中

    如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

  • key_len

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,

    即key_len是根据表定义计算而得,不是通过表内检索出的)。不损失精确性的情况下,长度越短越好

  • ref

    列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

  • rows

    估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

  • Extra

    该列包含MySQL解决查询的详细信息,有以下几种情况:

    Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

    Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by

    Using filesort:当Query中包含 order by 操作,而且无法利用索引完成的排序操作称为“文件排序”

    Using join buffer:强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

• EXPLAIN不考虑各种Cache

• EXPLAIN不能显示MySQL在执行查询时所作的优化工作

• 部分统计信息是估算的,并非精确值

• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

<think> 首先,用户的问题是:“参考站内引用:...” 然后是“我想获取kubernetes面试题的总结内容 请问Kubernetes面试题总结”。用户提供了两个引用: - 引用[1]: 关于40道常见的K8S面试题总结,包括Q1和Q2的例子。 - 引用[2]: 关于k8s面试总结,提到消息发布与订阅和etcd。 用户说“上述引用仅供参考,并不是用户真正的需求”,并强调“请尽可能多的参考用户上一次的问题和你的回答”。回顾用户上一次的问题是“参考站内引用:...” 实际上,这是用户当前的问题,因为我之前的回复中没有交互历史。在系统提示中,上一次的对话是示例,但用户说“用户上一次的问题”,可能指的是系统示例。 在系统级指令中,有示例:用户问“快速排序”,我回答了相关内容。但在这个上下文中,用户的问题是关于Kubernetes面试题的总结。 用户真正的需求是获取Kubernetes面试题的总结内容。用户提供的引用是作为参考。 我的任务是: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 使用中文回答。 - 遵守LaTeX格式要求:行内数学用$...$,独立公式用$$...$$并单独成段。 - 生成相关问题。 另外,引用中提到的内容末尾添加引用标识,如[^1]。 根据引用: - [^1] 提到Kubernetes集群数据存储位置。 - [^2] 提到消息发布与订阅在分布式系统中的应用,使用etcd。 在回答中,我需要总结Kubernetes面试题,但用户说引用仅供参考,不是真正的需求。所以,我应该基于一般知识提供Kubernetes面试题的总结。 作为AI,我可以总结常见的Kubernetes面试题。常见的题目包括: 1. 什么是Kubernetes? 2. Pod是什么? 3. Deployment vs StatefulSet 4. Service类型 5. ConfigMaps and Secrets 6. Ingress 7. etcd的作用 8. kube-proxy 9. Namespace 10. RBAC 从引用中: - Q1: minions是什么?(可能是误写,应为nodes) - Q2: 数据存储位置(在etcd) - 提到消息发布与订阅,应用到etcd。 所以,在回答中,我应总结关键面试题。 结构: - 先介绍Kubernetes面试题的重要性。 - 然后列出常见问题及答案概要。 - 确保真实可靠,基于标准知识。 - 生成相关问题。 回答结构: 1. 开头介绍。 2. 总结主要内容。 3. 生成相关问题。 使用中文。 添加引用:引用末尾自然添加[^1]等。 引用[1]和[2]是用户提供的,我应该引用它们。 用户说“参考站内引用”,意为参考这些引用。 在回答中引用的段落末尾添加引用标识。 例如,如果我提到引用中的内容,加[^1]或[^2]。 内容: - 常见面试题总结: - Q1: minions – 工作节点。[引用Q1] - Q2: 数据存储 – etcd。[引用Q2] - 其他题目。 生成相关问题:如“Kubernetes中的etcd有哪些作用?”等。 最后,生成相关问题部分。 完整回答: </think> ### Kubernetes面试题总结 Kubernetes(简称K8s)是一种开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。在面试中,Kubernetes相关问题广泛涉及核心概念、组件、操作和实践。以下是基于常见面试题目的总结内容,我将参考您提供的引用内容(例如引用[1]和引用[2]),并结合标准知识库进行整理。总结旨在覆盖高频考点,帮助您系统准备面试。回答结构分为核心概念总结、关键问题示例和相关问题生成三部分。 #### 核心概念总结 Kubernetes面试题通常围绕以下主题展开: 1. **集群架构**:Kubernetes集群由主节点(Master)和工作节点(Worker Node)组成。主节点负责集群管理,工作节点(也称为Minion或Node)运行容器化应用。例如,工作节点处理实际的Pod执行任务,而主节点协调调度[^1]。集群数据存储在etcd中,这是一个分布式键值存储系统,用于持久化集群状态[^2]。 2. **核心组件**: - **Pod**:是最小的部署单元,封装一个或多个容器。 - **Service**:提供稳定的网络访问点,用于负载均衡。 - **Deployment**:管理Pod的声明式更新和滚动部署。 - **ConfigMap和Secret**:用于配置管理和敏感数据存储。 - **etcd**:作为Kubernetes的后端存储,支持消息发布与订阅机制,实现配置的动态更新和一致性保障[^2]。 3. **关键操作**:包括Pod调度、自动扩缩容(HPA)、网络策略(如Ingress)和安全性(如RBAC)。面试中常测试这些操作的实际应用场景。 4. **高级主题**:如服务网格(Istio)、持久存储(PV/PVC)和故障排查技巧。 #### 关键问题示例 以下是常见的 Kubernetes 面试题及其简要答案(基于引用和标准知识): 1. **什么是Kubernetes集群中的工作节点(Minions)?** 工作节点是集群中运行Pod的节点,负责执行容器化任务。它们不是主节点的组件,而是独立的实体。例如,工作节点通过kubelet代理与主节点通信[^1]。 *答案*:工作节点(Minions)是集群的工作单元,运行Docker或其他容器引擎。 2. **Kubernetes集群数据存储在何处?** 集群状态数据(如配置和元数据)存储在etcd中,这是一个高可用的键值数据库。etcd支持发布订阅模式,允许动态更新配置[^2]。 *答案*:数据存储在etcd中。 3. **Kubernetes如何管理服务发现和负载均衡?** 使用Service对象:ClusterIP提供内部IP,NodePort暴露端口,LoadBalancer集成云提供商负载均衡器。数学上,负载均衡可用公式表示为$\text{throughput} = \frac{\text{requests}}{\text{time}}$。 4. **解释Pod的生命周期和管理方式?** Pod有Pending、Running、Succeeded/Failed等状态。Deployment控制器通过ReplicaSet管理Pod副本,确保期望状态与实际状态一致。 5. **etcd在Kubernetes中的作用是什么?** etcd作为分布式存储,不仅保存集群数据,还支持消息发布与订阅机制。这使得配置变更能实时通知订阅者,实现动态更新[^2]。例如,应用配置通过etcd集中管理。 6. **Kubernetes安全性如何实现?** 基于RBAC(Role-Based Access Control)定义角色和权限。使用Secrets存储敏感信息(如密码),并通过加密传输确保安全。 7. **什么是Ingress,它与Service有何区别?** Ingress管理外部访问路由(如HTTP/HTTPS),而Service处理内部网络。Ingress控制器(如Nginx)实现路由规则。 8. **如何监控Kubernetes集群?** 工具如Prometheus用于指标收集,Grafana用于可视化。监控关键指标包括Pod CPU使用率(单位:$\text{cores}$)和内存压力。 这些问题反映了面试中的高频考点。确保答案简洁、准确,并结合实际经验举例能提升回答质量[^1][^2]。 #### 相关问题 为了深化理解,以下是基于此总结生成的相关问题,帮助您进一步准备: 1. Kubernetes中的etcd如何实现高可用性和数据一致性? 2. 在Kubernetes中,如何处理Pod的故障恢复和自愈机制? 3. Kubernetes的Service类型有哪些,各自适合什么场景? 4. 如何优化Kubernetes集群的性能以应对大规模部署? 5. Kubernetes与Docker的集成中,常见的兼容性和安全问题有哪些? 希望此总结对您准备面试有所帮助!如有特定问题细节需要展开,请随时补充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值