附详解答案 美团面经总结基础篇

详细内容可以参考:
7. 为什么要使用索引?索引这么多优点,为什么不对表中的每一个列创建一个索引呢?索引是如何提高查询速度的?说一下使用索引的注意事项?Mysql索引主要使用的两种数据结构?什么是覆盖索引?
为什么要使用索引?
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性 。可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因 。帮助服务器避免排序和临时表将随机IO变为顺序IO可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义 。
索引这么多优点,为什么不对表中的每一个列创建一个索引呢?
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度 。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大 。创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加 。
索引是如何提高查询速度的?
将无序的数据变成相对有序的数据(就像查目录一样)
说一下使用索引的注意事项
避免 where 子句中对宇段施加函数,这会造成无法命中索引 。在使用时使用与业务无关的自增主键作为主键,即使用逻辑主键,而不要使用业务主键 。将打算加索引的列设置为 NOT NULL,否则将导致引擎放弃使用索引而进行全表扫描删除长期未使用的索引,不用的索引的存在会造成不必要的性能损耗 MySQL 5.7 可以通过查询 sys 库的视图来查询哪些索引从未被使用在使用 limit查询缓慢时,可以借助索引来提高性能
Mysql索引主要使用的哪两种数据结构?
什么是覆盖索引?
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称
之为“覆盖索引” 。我们知道在存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值 。最终还是要“回表”,也就是要通过主键再查找一次,这样就会比较慢 。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!
更多关于索引的内容可以查看我的这篇文章:【思维导图-索引篇】搞定数据库索引就是这么简单
8. 进程与线程的区别是什么?进程间的几种通信方式说一下?线程间的几种通信方式知道不?
进程与线程的区别是什么?
线程与进程相似 , 但线程是一个比进程更小的执行单位 。一个进程在其执行的过程中可以产生多个线程 。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此 , 线程也被称为轻量级进程 。另外,也正是因为共享资源,所以线程中执行时一般都要进行同步和互斥 。总的来说 , 进程和线程的主要差别在于它们是不同的操作系统资源管理方式 。
进程间的几种通信方式说一下?
管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用 。进程的血缘关系通常指父子进程关系 。管道分为pipe(无名管道)和fifo(命名管道)两种 , 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信 。信号量():信号量是一个计数器,可以用来控制多个进程对共享资源的访问 。它通常作为一种锁机制 , 防止某进程正在访问共享资源时,其他进程也访问该资源 。因此,主要作为进程间以及同一进程内不同线程之间的同步手段 。消息队列( queue):消息队列是由消息组成的链表 , 存放在内核中 并由消息队列标识符标识 。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点 。消息队列与管道通信相比,其优势是对每个消息指定特定的消息类型,接收的时候不需要按照队列次序 , 而是可以根据自定义条件接收特定类型的消息 。信号():信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生 。共享内存( ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问 , 共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的 。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信 。套接字():套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信 。
线程间的几种通信方式知道不?
1、锁机制
2、信号量机制:包括无名线程信号量与有名线程信号量
3、信号机制:类似于进程间的信号处理 。
线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制 。
9. 为什么要用单例模式?手写几种线程安全的单例模式?
简单来说使用单例模式可以带来下面几个好处:
懒汉式(双重检查加锁版本)
静态内部类方式
静态内部实现的单例是懒加载的且线程安全 。
只有通过显式调用方法时,才会显式装载类,从而实例化 (只有第一次使用这个单例的实例的时候才加载 , 同时不会有线程安全问题) 。
10. 简单介绍一下bean 。知道的bean的作用域与生命周期吗?
【附详解答案 美团面经总结基础篇】在中,那些组成应用程序的主体及由IOC 容器所管理的对象,被称之为 bean 。简单地讲,bean 就是由 IOC 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了 。而 bean 的定义以及 bean 相互间的依赖关系将通过配置元数据来描述 。
中的bean默认都是单例的 , 这些单例Bean在多线程程序下如何保证线程安全呢? 例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的线程来处理请求,引入框架之后,每个都是单例的,那么对于托管的单例 Bean,如何保证其安全呢? 的单例是基于也就是容器的,单例Bean在此容器内只有一个 , Java的单例是基于 JVM,每个 JVM 内只有一个实例 。
pring的bean的作用域
的bean的生命周期以及更多内容可以查看:一文轻松搞懂中bean的作用域与生命周期
11.中的事务传播行为了解吗?n 接口中哪五个表示隔离级别的常量?
事务传播行为
事务传播行为(为了解决业务层方法之间互相调用的事务问题):
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播 。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行 。在n定义中包括了如下几个表示传播行为的常量:
支持当前事务的情况:
不支持当前事务的情况:
其他情况:
隔离级别
n 接口中定义了五个表示隔离级别的常量:
12.原理了解吗?
原理
客户端发送请求-> 前端控制器接受客户端请求 -> 找到处理器映射解析请求对应的 ->会根据来调用真正的处理器开处理请求 , 并处理相应的业务逻辑 -> 处理器返回一个模型视图-> 视图解析器进行解析 -> 返回一个视图对象->前端控制器渲染数据(Moder)->将得到视图对象返回给用户
关于原理更多内容可以查看我的这篇文章: 工作原理详解
13.AOP IOC 实现原理
过了秋招挺长一段时间了,说实话我自己也忘了如何简要概括AOP IOC 实现原理,就在网上找了一个较为简洁的答案,下面分享给各位 。
IOC: 控制反转也叫依赖注入 。IOC利用java反射机制,AOP利用代理模式 。IOC 概念看似很抽象 , 但是很容易理解 。说简单点就是将对象交给容器管理 , 你只需要在配置文件中配置对应的bean以及设置相关的属性,让容器来生成类的实例对象以及管理对象 。在容器启动的时候,会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候 , 就把它已经初始化好的那些bean分配给你需要调用这些bean的类 。
AOP: 面向切面编程 。(- )。AOP可以说是对OOP的补充和完善 。OOP引入封装、继承和多态性等概念来建立一种对象层次结构mysql索引类型都有哪些,用以模拟公共行为的一个集合 。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式mysql索引类型都有哪些,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面” , 从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理 。
原文:https://mp.weixin.qq.com/s/HDFzbAHP2bXCl1iOxa5wDg
本文到此结束,希望对大家有所帮助 。