《2023年Java(1~5年经验)面试题.docx》由会员分享,可在线阅读,更多相关《2023年Java(1~5年经验)面试题.docx(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023年Java (15年经验)面试题(一)一、基础篇1、如何实现对象克隆?【仅供参考】实现Cloneable接口并重写Object类中的clone()方法。实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现 真正的深度克隆。2、重载(Overload)和重写(Override)的区别?【仅供参考】方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态 性,而后者实现的是运行时的多态性。重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不 同、参数个数不同或者二者都不同)。重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不
2、能改 变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变, 核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。3、JDK1. 8之后有哪些新特性?【仅供参考】接口默认方法:Java 8允许我们给接口添加一个非抽象的方法实现,只需要使 用default关键字即可Lambda表达式和函数式接口: Lambda表达式本质上是一段匿名内部类,也可 以是一段可以传递的代码。Lambda允许把函数作为一个方法的参数(函数作为 参数传递到方法中),使用Lambda表达式使代码更加简洁,但是也不要滥用, 否则会有可读性等问题,Effective Java作者Josh Bloch建
3、议使用 Lambda表达式最好不要超过3行。Stream API:用函数式编程方式在集合类上进行复杂操作的工具,配合Lambda 表达式可以方便的对集合进行处理。Java8中处理集合的关键抽象概念,它可 以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据 等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数 据库查询。也可以使用Stream API来并行执行操作。简而言之,Stream APIpublic static void foo() new Inner ();public void bar() new Inner();public stati
4、c void main(String args) new Inner();)Java中非静态内部类对象的创建要依赖其外部类对象,上面的面试题中f。和 main方法都是静态方法,静态方法中没有this,也就是说没有所谓的外部类对 象,因此无法创建内部类对象,如果要在静态方法中创建内部类对象,可以这 样做:new Outer (). new Inner ();在java编程中,用到反射的地方还是很多的,比如java框架就大量使用反 射,还有在加载驱动和读取配置文件时,反射也是比不可少的。所以在java面 试中,面试官会想要考察应聘者反射方面的知识,那么有面试需要的朋友,就 必须提前做好准备,将能搜
5、集到的java反射面试题整理到一起记住,另外, java零基础的小白也可以根据这篇java反射面试题来认识java反射。14、实现Java反射的类有什么?【仅供参考】(l)Class:表示正在运行的Java应用程序中的类和接口,注意所有获取对象的 信息都需要Class类来实现;(2)Field:提供有关类和接口的属性信息,以及对它的动态访问权限;(3)Constructor:提供关于类的单个构造方法的信息以及它的访问权限;(4)Method:提供类或接口中某个方法的信息。15、接口是什么?为什么要使用接口而不是直接使用具体类?【仅供参考】接口用于定义API。它定义了类必须得遵循的规则。同时一,
6、它提供了一种抽 象,因为客户端只使用接口,这样可以有多重实现,如List接口,你可以使 用可随机访问的ArrayList,也可以使用方便插入和删除的LinkedListo接口 中不允许写代码,以此来保证抽象,但是Java 8中你可以在接口声明静态的 默认方法,这种方法是具体的。16、设计一个ATM机,请说出你的设计思路?【仅供参考】比如设计金融系统来说,必须知道它们应该在任何情况下都能够正常工作。不 管是断电还是其他情况,ATM应该保持正确的状态(事务),想想加锁(locking)、事务(transaction)、错误条件(error condition)、边界条件 (boundary con
7、dition)等等。尽管你不能想到具体的设计,但如果你可以指 出非功能性需求,提出一些问题,想到关于边界条件,这些都会是很好的。17、简述分代垃圾回收器是怎么工作的?【仅供参考】分代回收器有两个分区:老生代和新生代,新生代默认的空间占比总空间的 1/3,老生代的默认占比是2/3o新生代使用的是复制算法,新生代里有3个分区:Eden、To Survivor、From Survivor,它们的默认占比是8:1:1,它的执行流程如下:把 Eden + From Survivor 存活的对象放入 To Survivor 区;清空 Eden 和 From Survivor 分区;From Survivo
8、r 和 To Survivor 分区交换,From Survivor 变 To Survivor, To Survivor 变 From Survivor。每次在From Survivor到To Survivor移动时都存活的对象,年龄就+1,当 年龄到达15 (默认配置是15)时,升级为老生代。大对象也会直接进入老生 代。老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理 的执行算法。以上这些循环往复就构成了整个分代垃圾回收的整体执行流程。18、什么是双亲委派模型?【仅供参考】在介绍双亲委派模型之前先说下类加载器。对于任意一个类,都需要由加载它 的类加载器和这个类本身一同确
9、立在JVM中的唯一性,每一个类加载器,都有 一个独立的类名称空间。类加载器就是根据指定全限定名称将class文件加载 到JVM内存,然后再转化为class对象。类加载器分类:启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载 Java_HOME/lib/目录中的,或者被-Xbootclasspath参数所指定的路径中并且 被虚拟机识别的类库;其他类加载器:扩展类加载器(Extension ClassLoader):负责加载java_home style=box- sizing: border-box; outline: Opx ! important;”
10、libext 目录或 Java. ext. dirs系统变量指定的路径中的所有类库;应用程序类加载器(Application ClassLoader)。负责加载用户类路径 (classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如 果我们没有自定义类加载器默认就是用这个加载器。双亲委派模型:如果一个类加载器收到了类加载的请求,它首先不会自己去加 载这个类,而是把这个请求委派给父类加载器去完成,每一层的类加载器都是 如此,这样所有的加载请求都会被传送到顶层的启动类加载器中,只有当父加 载无法完成加载请求(它的搜索范围中没找到所需的类)时,子加载器才会尝 试去加载类。19、说一
11、下JVM调优的工具?【仅供参考】JDK自带了很多监控工具,都位于JDK的bin目录下,其中最常用的是 jconsole和jvisualvm这两款视图监控工具。jconsole:用于对JVM中的内存、线程和类等进行监控;jvisualvm: JDK自带的全能分析工具,可以分析:内存快照、线程快照、程序 死锁、监控内存的变化、gc变化等。20、说一下JVM有哪些垃圾回收器?【仅供参考】Serial:最早的单线程串行垃圾回收器。Serial Old: Serial垃圾回收器的老年版本,同样也是单线程的,可以作为 CMS垃圾回收器的备选预案。Par New:是Serial的多线程版本。Parallel
12、和ParNew收集器类似是多线程的,但Parallel是吞吐量优先的收 集器,可以牺牲等待时间换取系统的吞吐量。Parallel Old是Parallel老生代版本,Parallel使用的是复制的内存回收 算法,Parallel Old使用的是标记-整理的内存回收算法。CMS: 一种以获得最短停顿时间为目标的收集器,非常适用B/S系统。G1: 一种兼顾吞吐量和停顿时间的GC实现,是JDK 9以后的默认GC选项。三、Java Web/Spring/Spring MVC/Hibernate/MyBatis/SpringBoot/Spring Cloud1、Servlet是线程安全的吗【仅供参考】S
13、ervlet不是线程安全的,多线程并发的读写会导致数据不同步的问题。解决的办法是尽量不要在实现servlet接口的类中定义实例变量,而是要把变 量分别定义在doGet()和doPostO方法内。虽然使用synchronized (name) 语 句块可以解决问题,但是会造成线程的等待,不是很科学的办法。注意:多线程的并发的读写Servlet类属性会导致数据不同步。但是如果只是 并发地读取属性而不写入,则不存在数据不同步的问题。因此Servlet里的只 读属性最好定义为final类型的。2、http和https的基本概念【仅供参考】-HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和
14、服务器端请求 和应答的标准(TCP),用于计算机之间传输文字,图片,音频,视频等超文本 数据的协议,它可以使浏览器更加高效,使网络传输减少-HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入 SSL层,HTTPS的安全基础是SSL, HTTPS就是从HTTP加上加密处理(一般是 SSL安全通信线路)+认证+完整性保护-HTTPS协议的主要作用:建立一个信息安全通道,来保证数据传输的安全确认网站的真实性3、说一下JS0NP实现原理?【仅供参考】jsonp: JSON with Padding,它是利用script标签的src连接可以访问不同 源的特性,加载远程返
15、回的“JS函数”来执行的。4、Autowired的作用是什么?【仅供参考】Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的 工作,通过Autowired的使用来消除set/get方法。5、RequestMapping的作用是什么?【仅供参考】将http请求映射到相应的类/方法上。6、你如何理解Spring Boot中的Starters?【仅供参考】Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包, 你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。 如你想使用Spring JPA访问数据库,只要加入spring-boo
16、t-starter-data- jpa启动器依赖就能使用了。7、springboot 集成 mybatis 的过程【仅供参考】添加 mybatis 的 starter maven 依赖org. mybatis. spring. bootmybatis-spring-boot-starterl. 3. 2在mybatis的接口中 添加Mapper注解在application. yml配置数据源信息8、开启Spring Boot特性有哪几种方式?【仅供参考】继承 spring-boot-starter-parent 项目1) 导入 spring-boot-dependencies 项 目依赖9、j
17、pa和hibernate有什么区别?【仅供参考】jpa 全称 Java Persistence API,是 Java 持久化接口规范,hibernate 属于 jpa的具体实现。10、spring boot有哪些方式可以实现热部署?【仅供参考】使用devtools启动热部署,添加devtools库,在配置文件中把spring, devtools. restart, enabled 设置为 true;使用Intellij Idea编辑器,勾上自动编译或手动重新编译。11、为什么我们不建议在实际的应用程序中使用Spring Data Rest?【仅供参考】我们认为Spring Data Rest很
18、适合快速原型制造!在大型应用程序中使用需 要谨慎。通过Spring Data REST你可以把你的数据实体作为RESTful服务直接发布。 当你设计RESTful服务器的时候,最佳实践表明,你的接口应该考虑到两件重 要的事情:你的模型范围。你的客户。通过With Spring Data REST,你不需要再考虑这两个方面,只需要作为TEST 服务发布实体。这就是为什么我们建议使用Spring Data Rest在快速原型构造上面,或者作 为项目的初始解决方法。对于完整演变项目来说,这并不是一个好的注意。12、RequestMapping 和 GetMapping 的不同之处在哪里?【仅供参考】
19、RequestMapping具有类属性的,可以进行GET, POST, PUT或者其它的注释中具 有的请求方法。GetMapping是GET请求方法中的一个特例。它只是 ResquestMapping的一个延伸,目的是为了提高清晰度。13、spring cloud的核心组件有哪些?【仅供参考】Eureka:服务注册于发现。Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发 起请求。Ribbon:实现负载均衡,从一个服务的多台机器中选择一台。Hystrix:提供线程池,不同的服务走不同的线程池,实现了不同服务调用的隔 离,避免了服务雪崩的问题。Zuul:网关管理,由Zuu
20、l网关转发请求给对应的服务。14、spring cloud断路器的作用是什么?【仅供参考】在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障 (类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向 调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用 故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。15、Springboot有哪些优点?【仅供参考】-快速创建独立运行的spring项目与主流框架集成-使用嵌入式的servlet容器,应用无需打包成war包-starters自动依赖与版本控制-大量的自动配置,简化开发,也可修改默认值-准生
21、产环境的运行应用监控-与云计算的天然集成16、什么是 Spring Data REST?【仅供参考】Spring Data TEST可以用来发布关于Spring数据库的HATEOAS RESTful资 源。17、如何重新加载Spring Boot上的更改,而无需重新启动服务器?【仅供参考】这可以使用DEV工具来实现。通过这种依赖关系,您可以节省任何更改,嵌入 式tomcat将重新启动。Spring Boot有一个开发工具(DevTools)模块,它有助于提高开发人员的生 产力。Java开发人员面临的一个主要挑战是将文件更改自动部署到服务器并自 动重启服务器。开发人员可以重新加载Spring B
22、oot上的更改,而无需重新启动服务器。这将 消除每次手动部署更改的需要。Spring Boot在发布它的第一个版本时没有这 个功能。这是开发人员最需要的功能。DevTools模块完全满足开发人员的需求。该模块 将在生产环境中被禁用。它还提供H2数据库控制台以更好地测试应用程序。 org.springframework, bootspring-boot-devtools18、MyBatis 有哪些执行器(Executor) ?【仅供参考】MyBatis有三种基本的Executor执行器:SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对
23、象,用完立刻关闭Statement对象;ReuseExecutor:执行 update 或 select,以 SQL 作为 key 查找 Statement 对象,存在就使用,不存在就创建,用完后不关闭Statement对象,而是放置 于Map内供下一次使用。简言之,就是重复使用Statement对象;BatchExecutor:执行 update (没有 select, jdbc 批处理不支持 select),将所有SQL都添加到批处理中(addBatchO),等待统一执行(executeBatch(),它缓存了多个 Statement 对象,每个 Statement 对象都 是 是dBat
24、ch。完毕后,等待逐一执行executeBatch。批处理,与jdbc批处 理相同。19、hibernate实体类可以被定义为final吗?【仅供参考】实体类可以定义为final类,但这样的话就不能使用hibernate代理模式下 的延迟关联提供性能了,所以不建议定义实体类为finaE20、MyBatis中#和$的区别是什么?【仅供参考】#是预编译处理,$是字符替换。在使用#时,MyBatis会将SQL中的 #替换成“?,配合PreparedStatement的set方法赋值,这样可以有效 的防止SQL注入,保证程序的运行安全。四、Redis/RabbitMQ/Kafka/Zookeeper1
25、、Rabb it MQ集群搭建需要注意哪些问题?【仅供参考】各节点之间使用“一link”连接,此属性不能忽略。各节点使用的erlang cookie值必须相同,此值相当于“秘钥”的功能,用于 各节点的认证。整个集群中必须包含一个磁盘节点。2、RabbitMQ持久化有什么缺点?【仅供参考】持久化的缺地就是降低了服务器的吞吐量,因为使用的是磁盘而非内存存储, 从而降低了吞吐量。可尽量使用ssd硬盘来缓解吞吐量的问题。3、RabbitMQ怎么避免消息丢失?【仅供参考】把消息持久化磁盘,保证服务器重启消息不丢失。每个集群中至少有一个物理磁盘,保证消息落入磁盘。4 RabbitMQ中vhost的作用是什
26、么?【仅供参考】vhost:每个RabbitMQ都能创建很多vhost,我们称之为虚拟主机,每个虚拟 主机其实都是mini版的RabbitMQ,它拥有自己的队列,交换器和绑定,拥有 自己的权限机制。5、RabbitMQ的消息是怎么发送的?【仅供参考】首先客户端必须连接到RabbitMQ服务器才能发布和消费消息,客户端和 rabbit server之间会创建一个tcp连接,一旦tcp打开并通过了认证(认 证就是你发送给rabbit服务器的用户名和密码),你的客户端和RabbitMQ就 创建了一条amqp信道(channel),信道是创建在“真实” tcp上的虚拟连 接,amqp命令都是通过信道发
27、送出去的,每个信道都会有一个唯一的id,不 论是发布消息,订阅队列都是通过这个信道完成的。6、RabbitMQ节点的类型有哪些?【仅供参考】磁盘节点:消息会存储到磁盘。内存节点:消息都存储在内存中,重启服务器消息丢失,性能高于磁盘类型。7、RabbitMQ集群有什么用?【仅供参考】集群主要有以下两个用途:高可用:某个服务器出现问题,整个RabbitMQ还可以继续使用;高容量:集群可以承载更多的消息量。8、RabbitMQ怎么保证消息的稳定性?【仅供参考】提供了事务的功能。通过将channel设置为confirm (确认)模式。9、kafka如何减少数据丢失?【仅供参考】一般我们在用到这种消息中
28、件的时候,肯定会考虑要怎样才能保证数据不丢 失,在面试中也会问到相关的问题。但凡遇到这种问题,是指3个方面的数据 不丢失,即:producer consumer端数据不丢失broker端数据不丢失 10、为什么要使用ka妹a,为什么要使用消息队列?【仅供参考】缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多 的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在 kafka中,下游服务就可以按照自己的节奏进行慢慢处理。解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一 个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩 展
29、能力。冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic 的服务消费到,供多个毫无关联的业务使用。健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影 响主要业务的正常进行。异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步 处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放 入多少消息就放多少,然后在需要的时候再去处理它们。11、kafka中的broker是干什么的?【仅供参考】broker是消息的代理,Producers往Brokers里面的指定Topic中写消息, Consumers从Brokers里面拉取指定To
30、pic的消息,然后进行业务处理, broker在中间起到一个代理保存消息的中转站。12、zookeeper都有哪些功能?【仅供参考】集群管理:监控节点存活状态、运行请求等。主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选 举说的就是这个选举的过程,使用zookeeper可以协助完成这个过程。分布式锁:zookeeper提供两种锁:独占锁、共享锁。独占锁即一次只能有一 个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同 一个资源,如果要使用写锁也只能有一个线程使用。zookeeper可以对分布式 锁进行控制。命名服务:在分布式系统中,通过使用命名服务,客户端
31、应用能够根据指定名 字来获取资源或服务的地址,提供者等信息。13、zookeeper怎么保证主从节点的状态同步?【仅供参考】zookeeper的核心是原子广播,这个机制保证了各个server之间的同步。实 现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选 提供了一种高效且易于使用的处理数据的方式。方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象 (实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更 紧凑简洁,减少冗余代码。日期时间API: Java 8引入了新的日期时间API改进了日期时间的管理。 Optional类:著名的
32、NullPointerException是引起系统失败最常见的原因。 很久以前Google Guava项目引入了 Optional作为解决空指针异常的一种方 式,不赞成代码被null检查的代码污染,期望程序员写整洁的代码。受 Google Guava的鼓励,Optional现在是Java 8库的一部分。新工具:新的编译工具,如:Nashorn引擎jjs、类依赖分析器jdepso4两个对象的hashCode()相同,则equals()是否也一定为true?【仅供参考】equals 与 hashcode 的关系:如果两个对象调用equals比较返回true,那么它们的hashCode值一定要相 同
33、;如果两个对象的hashCode相同,它们并不一定相同。hashcode方法主要是用来提升对象比较的效率,先进行hashcode ()的比较,如 果不相同,那就不必在进行equals的比较,这样就大大减少了 equals比较的 次数,当比较对象的数量很大的时候能提升效率。之所以重写equals。要重写hashcode(),是为了保证equals。方法返回true 的情况下hashcode值也要一致,如果重写了 equals ()没有重写hashcode (), 就会出现两个对象相等但hashcode()不相等的情况。这样,当用其中的一个对 象作为键保存到hashMap、hashTable或ha
34、shSet中,再以另一个对象作为键值 去查找他们的时候,则会查找不到。5、Object常用方法有哪些?【仅供参考】Java面试经常会出现的一道题目,Object的常用方法。下面给大家整理一下。 Object 常用方法有:toStringO equals () hashCode。、clone。等。6、普通类和抽象类有哪些区别?【仅供参考】普通类不能包含抽象方法,抽象类可以包含抽象方法。抽象类不能直接实例化,普通类可以直接实例化。7、接口和抽象类有什么区别?主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复 模式,当领导者被选举出来,且大多数server完成了和leader的
35、状态同步 以后,恢复模式就结束了。状态同步保证了 leader和server具有相同的系 统状态。14、集群中有3台服务器,其中一个节点宕机,这个时候zookeeper还可以 使用吗?【仅供参考】可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。15、kafka可以脱离zookeeper单独使用吗?为什么?【仅供参考】kafka不能脱离zookeeper单独使用,因为kafka使用zookeeper管理和协 调kafka的节点服务器。16、jedis和Redisson有哪些区别?【仅供参考】jedis:提供了比较全面的Redis命令的支持。Redisson:实现了分布式和可扩展
36、的Java数据结构,与jedis相比 Redisson的功能相对简单,不支持排序、事务、管道、分区等Redis特性。17、Redis支持的Java客户端都有哪些?【仅供参考】支持的 Java 客户端有 Redisson、jedis、lettuce 等。18、Redis持久化有几种方式?【仅供参考】Redis的持久化有两种方式,或者说有两种策略:RDB (Redis Database):指定的时间间隔能对你的数据进行快照存储。AOF (Append Only File):每一个收到的写命令都通过write函数追加到文件 中。19、Redis为什么是单线程的?【仅供参考】因为cpu不是Redis的
37、瓶颈,Redis的瓶颈最有可能是机器内存或者网络带 宽。既然单线程容易实现,而且cpu又不会成为瓶颈,那就顺理成章地采用单 线程的方案了。关于Redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 而且单线程并不代表就慢nginx和nodejs也都是高性能单线程的代表。20、Redis是什么?都有哪些使用场景?【仅供参考】Redis是一个使用C语言开发的高速缓存数据库。Redis使用场景:记录帖子点赞数、点击数、评论数;缓存近期热帖;缓存文章详情信息;记录用户会话信息。五、MySQL1、哪些操作会导致索引失效?【仅供参考】对索引使用左或者左右模糊匹配,也就是like %xx或者l
38、ike %xx%这两种方 式都会造成索引失效。原因在于查询的结果可能是多个,不知道从哪个索引值 开始比较,于是就只能通过全表扫描的方式来查询。对索引进行函数/对索引进行表达式计算,因为索引保持的是索引字段的原始 值,而不是经过函数计算的值,自然就没办法走索引。对索引进行隐式转换相当于使用了新函数。WHERE子句中的0R语句,只要有条件列不是索引列,就会进行全表扫描。2、误删数据怎么办?【仅供参考】DBA的最核心的工作就是保证数据的完整性,先要做好预防,预防的话大概是 通过这几个点:权限控制与分配(数据库和服务器权限)制作操作规范定期给开发进行培训搭建延迟备库做好SQL审计,只要是对线上数据有更
39、改操作的语句(DML和DDL)都需要进行 审核做好备份。备份的话又分为两个点(1)如果数据量比较大,用物理备份 xtrabackupo定期对数据库进行全量备份,也可以做增量备份。(2)如果数据量 较少,用mysqldump或者mysqldumper。再利用binlog来恢复或者搭建主从 的方式来恢复数据。定期备份binlog文件也是很有必要的 如果发生了数据删除的操作,又可以从以下几个点来恢复:DML误操作语句造成数据不完整或者丢失。可以通过flashback,美团的 myflash,也是一个不错的工具,本质都差不多 都是先解析binlog event,然后在进行反转。把delete反转为in
40、sert, insert 反转为 delete, update 前后 image 对调。所以必须设置binlog_format=row和binlog_row_image=fulL切记恢复数据 的时候,应该先恢复到临时的实例,然后在恢复回主库上。DDL语句误操作(truncate和drop),由于DDL语句不管binlog_format是 row还是statement ,在binlog里都只记录语句,不记录image所以恢复 起来相对要麻烦得多。只能通过全量备份+应用binlog的方式来恢复数据。一旦数据量比较大,那么 恢复时间就特别长rm删除:使用备份跨机房,或者最好是跨城市保存。3、如何理解
41、MySQL的边读边发?【仅供参考】如果客户端接受慢,会导致MySQL服务端由于结果发不出去,这个事务的执行 时间会很长。服务端并不需要保存一个完整的结果集,取数据和发数据的流程都是通过一个 next_buffer来操作的。内存的数据页都是在Buffer_Pool中操作的。InnoDB管理Buffer_Pool使用的是改进的LRU算法,使用链表实现,实现 上,按照5:3的比例把整个LRU链表分成了 young区域和old区域。4、都说InnoDB好,那还要不要使用MEMORY引擎?【仅供参考】内存表就是使用memory引擎创建的表为什么我不建议你在生产环境上使用内存表。这里的原因主要包括两个方面
42、: 锁粒度问题;数据持久化问题。由于重启会丢数据,如果一个备库重启,会导致主备同步线程停止;如果主库 跟这个备库是双M架构,还可能导致主库的内存表数据被删掉。5、为什么删除了表,表文件的大小还是没变?【仅供参考】数据项删除之后InnoDB某个页page A会被标记为可复用。delete命令把整个表的数据删除,结果就是,所有的数据页都会被标记为可复 用。但是磁盘上,文件不会变小。经过大量增删改的表,都是可能是存在空洞的。这些空洞也占空间所以,如果 能够把这些空洞去掉,就能达到收缩表空间的目的。重建表,就可以达到这样的目的。可以使用alter table A engine=InnoDB命 令来重建
43、表。6、MySQL使用索引的原因?【仅供参考】根本原因索引的出现,就是为了提高数据查询的效率,就像书的目录一样。对于数据库的表而言,索引其实就是它的“目录”。扩展创建唯一性索引,可以保证数据库表中每一行数据的唯一性。帮助引擎层避免排序和临时表将随机10变为顺序10,加速表和表之间的连接。7、详细说一下一条MySQL语句执行的步骤【仅供参考】Server层按顺序执行SQL的步骤为:客户端请求- 连接器(验证用户身份,给予权限)查询缓存(存在缓存则直接返回,不存在则执行后续操作)分析器(对SQL进行词法分析和语法分析操作)优化器(主要对执行的SQL优化选择最优的执行方案方法)执行器(执行时会先看用
44、户是否有执行权限,有才去使用这个引擎提供的接)-去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)索引相关8、MySQL有哪些自增ID?各自场景是什么?【仅供参考】表的自增ID达到上限之后,在申请值不会变化,进而导致联系插入数据的时 候报主键冲突错误。row_id达到上限之后,归0在重新递增,如果出现相同的rowjid后写的数 据会覆盖之前的数据。Xid只需要不在同一个binlog文件出现重复值即可,理论上会出现重复值, 但概率极小可忽略不计。InnoDB的max_trx_id递增值每次MySQL重启会保存起来。Xid是由server层维护的。InnoDB内部使用Xid,就是为了能够在I
45、nnoDB 事务和server之间做关联。但是,InnoDB自己的trx_id,是另外维护的。 threaded是我们使用中最常见的,而且也是处理得最好的一个自增id逻辑 T 0 使用了 insert_unique 算法9、join 用法?【仅供参考】使用left join左边的表不一定是驱动表如果需要left join的语义,就不能把被驱动表的字段放在where条件里面 做等值判断或不等值判断,必须都写在on里面标准的group by语句,是需要在select部分加一个聚合函数,比如select a, count(*) from t group by a order by null;10、如
46、何最快的复制一张表?【仅供参考】为了避免对源表加读锁,更稳妥的方案是先将数据写到外部文本文件,然后再 写回目标表一种方法是,使用mysqldump命令将数据导出成一组INSERT语句另一种方法是直接将结果导出成.csv文件。MySQL提供语法,用来将查询结果 导出到服务端本地目录:select * from dbl. t where a900 into outfile /server_tmp/t. csv;得到.csv导出文件后,你就可以用下面的load data 命令将数据导入到目标表 db2. t 中:load data infile J/server_tmp/t. csv, into t
47、able db2. t;物理拷贝:在MySQL 5. 6版本引入了可传输表空间(transportable tablespace)的方法,可以通过导出+导入表空间的方式,实现物理拷贝表的 功能。11、MySQL 的 change buffer 是什么?【仅供参考】当需要更新一个数据页时,如果数据页在内存中就直接更新;而如果这个数据 页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新 操作缓存在change buffer中。这样就不需要从磁盘中读入这个数据页了,在下次查询需要访问这个数据页的 时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。 通过这种方式就能保证这个数据逻辑的正确性。注意唯一索引的更新就不能使用change buffer,实际上也只有普通索引可以 使用。适用场景:-对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此 时change buffer的使用效果最好。这种业务模型常见的就是账单类、日志类 的系统。-反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足 了条件,将更新先记录在change buffer,但之后由于马上要访问这个数据 页,会立即触发merge过程。这样随机访问10的次数不会减少,反而增加了 chan