JAVA面试题

java基础

抽象类和接口有什么区别?

抽象类要被子类继承,接口要被子类实现。
抽象类可以有构造方法,接口中不能有构造方法。
抽象类中可以有普通成员变量,接口中没有普通成员变量,它的变量只能是公共的静态的常量
一个类可以实现多个接口,但是只能继承一个父类,这个父类可以是抽象类。
接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。
抽象级别(从高到低):接口>抽象类>实现类。
抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。
抽象类的关键字是abstract,接口的关键字是interface

List、Map、Set面试题

ArrayList和LinkedList有什么区别?分别从它们的底层数据结构、效率、开销进行阐述;

数据结构:ArrayList是数组的数据结构,LinkedList是链表的数据结构。
效率:随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于索引(index)的数据结构,可以直接映射到。插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。
开销:LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。

List、Map、Set 三个接口,存取元素时,各有什么特点?

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存 key-value 值,value 可多值。
32.Java中的HashMap的工作原理是什么?

HashMap的原理是:数组+链表。

HashMap类有一个叫Entry的内部类。这个Entry类包含了key-value作为实例变量。根据key的hashcode方法计算出hash值来决定具体在哪个位置,如果这个位置有值,则调用equals方法进行判断,如果equals相等则替换,如果equals不等则追加到链表后。

在1.7采用头插法,元素每次插入到链表头部,当扩容时,会发生链表反转,容易产生循环链表,多线程情况下可能发生死锁。

在1.8采用尾插法,元素每次插入到链表尾部,扩容不会发生反转,解决了死锁问题。数组+链表+红黑树。当链表长度超过8时转为红黑树。

Set如何保证内部元素不重复的?

利用HashMap的Key原理,存的是hashmap的key,值为一个固定值常量。元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals 方法 如果 equls 结果为 true , HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。

Java中IO流分为几种?

Java中的流分为两种:一种是字节流,另一种是字符流。
IO流分别由四个抽象类来表示(两输入两输出):InputStream,OutputStream,Reader,Writer。

final 在 java 中有什么作用?

final 修饰的类叫最终类,该类不能被继承。 final 修饰的方法不能被重写。
final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

java 中操作字符串都有哪些类?它们之间有什么区别?

答:String、StringBuffer、StringBuilder可以操作拼接字符串

区别:String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,StringBuffer和StringBuilder是可以改变对象的。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程

== 和 equals 的区别是什么?

答:==是操作符,是比较两个对象的地址或基本类型,equals是比较两个对象的内容,属于Object里的方法。

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

答:不对!hashCode()相同,不代表两个对象就相同。hashCode值是从hash表中得来的,hash是一个函数,该函数的实现是一种算法,通过hash算法算出hash值,hash表就是hash值组成的,一共有8个位置。 eg:h = key%7 8%7 = 1 ;1%7 = 1;
1)、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2)、如果两个对象不equals,他们的hashcode有可能相等。
3)、如果两个对象hashcode相等,他们不一定equals。
4)、如果两个对象hashcode不相等,他们一定不equals。

static

是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。

反射

什么是反射,获取Class对象的三种方法?

反射是在运行时动态的获取类的信息,获取Class对象有三种方法:类名.class、对象名.getClass()、Class.forName(“权限定名”)

JVM

JVM分为哪些区,每一个区是干嘛的?

JVM内存结构包括:堆、虚拟机栈、本地方法栈、程序计数器、方法区

堆:存放new的对象,是内存中最大的一块区域

虚拟机栈:就是我们平时所说的栈,用来存放基本数据类型和对象的引用

本地方法栈:与虚拟机栈相同,只不过是为native方法服务的

程序计数器:用来标记程序运行到哪一行

方法区也叫永久代,存放类的信息。在jdk1.6及以前,常量池在方法区里,常量池用于存放静态变量和字面量;在jdk1.7,常量池从方法区中分离出来,在内存中开辟了一段空间作为常量池;在jdk1.8,取消了方法区,取而代之的是元数据区。

================================================================================================

Spring面试题

谈谈你对Spring的IoC理解?

IOC,Inversion of Control,控制反转,指将对象的控制权转移给Spring框架,由 Spring
来负责控制对象的生命周期(比如创建、销毁)和对象间的依赖关系。
最直观的表达就是,以前创建对象的时机和主动权都是由自己把控的,如果在一个对象中使用另外的对象,就必须主动通过new指令去创建依赖对象,使用完后还需要销毁(比如Connection等),对象始终会和其他接口或类耦合起来。而IOC 则是由专门的容器来帮忙创建对象,将所有的类都在 Spring 容器中登记,当需要某个对象时,不再需要自己主动去 new 了,只需告诉Spring 容器,然后 Spring 就会在系统运行到适当的时机,把你想要的对象主动给你。也就是说,对于某个具体的对象而言,以前是由自己控制它所引用对象的生命周期,而在IOC中,所有的对象都被Spring 控制,控制对象生命周期的不再是引用它的对象,而是Spring容器,由 Spring容器帮我们创建、查找及注入依赖对象,而引用对象只是被动的接受依赖对象,所以这叫控制反转。

什么是DI?

IoC 的一个重点就是在程序运行时,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency
Injection,依赖注入)来实现的,即应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI
具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性

=============================================================================

SpringMVC面试题

SpringMVC的流程?

(1)用户发送请求至前端控制器DispatcherServlet;
(2)DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handler;
(3)处理器映射器根据请求url找到具体的处理器Handler,生成处理器对象及处理器拦截器(如果有则生成),一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器,请求执行Handler;
(5)HandlerAdapter 经过适配调用 具体处理器进行处理业务逻辑;
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
在这里插入图片描述
前端控制器 DispatcherServlet:接收请求、响应结果,相当于转发器,有了DispatcherServlet 就减少了其它组件之间的耦合度。
处理器映射器 HandlerMapping:根据请求的URL来查找Handler
处理器适配器 HandlerAdapter:负责执行Handler
处理器 Handler:处理器,需要程序员开发
视图解析器 ViewResolver:进行视图的解析,根据视图逻辑名将ModelAndView解析成真正的视图(view)
视图View:View是一个接口, 它的实现类支持不同的视图类型,如jsp,freemarker,pdf等等

============================================================================

SpringBoot面试题

SpringBoot的核心配置文件有哪几个?他们的区别是什么呢?

Spring Boot的核心配置文件是application 和 bootstrap 配置文件。 application
配置文件这个容易理解,主要是用于 Spring Boot 项目的自动化配置。 bootstrap 配置文件有以下几个应用场景: 使用
Spring Cloud Config 配置中心时,这时需要在 bootstrap
配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息; 一些固定的不能被覆盖的属性; 一些加密/解密的场景出现

Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class
})。
@ComponentScan:Spring组件扫描

=============================================================================

SpringCloud面试题

说出几个常见的springcloud核⼼组件

1、Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka
Client还可以反过来从Eureka Server拉取注册表,从⽽知道其他服务在哪⾥

2、 Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从⼀个服务的多台机器中选择⼀台

3、 Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

4、 Hystrix:发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题

5、 Zuul:如果前端、移动端要调⽤后端系统,统⼀从Zuul⽹关进⼊,由Zuul⽹关转发请求给对应的服务

什么是Eureka的自我保护模式?

默认情况下,如果Eureka Service在一定时间内没有接收到某个微服务的心跳,Eureka Service会进入自我保护模式,在该模式下Eureka Service会保护服务注册表中的信息,不在删除注册表中的数据,当网络故障恢复后,Eureka Servic 节点会自动退出自我保护模式。Eureka Client 向 Eureka Server 发送心跳的频率(默认 30 秒)当Eureka Server(默认90秒)未收到请求时则进入自我保护状态

谈谈你对Hystrix的理解以及对服务降级、服务熔断、服务限流的理解

断路器(Hystrix)可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续执行而不等待故障。如果问题已经得到纠正,应用程序可以尝试调用操作。在分布式系统中,每个服务都可能会调用很多其他服务,被调用的那些服务就是依赖服务,有的时候某些依赖服务出现故障也是很常见的。
Hystrix 可以让我们在分布式系统中对服务间的调用进行控制,加入一些调用延迟或者依赖故障的容错机制。

1.服务降级:

服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示,fallback
哪些情况会发出降级?程序运行异常 超时 服务熔断触发服务降级 线程池 / 信号量打满也会导致服务降级
2.服务熔断:

类似保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示。一段时间后再尝试去看看恢复没有。

3.服务限流:

秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行。高并发的流量涌入进来,比如说突然间一秒钟100万QPS,废掉了,10万QPS进入系统,其他90万QPS被拒绝了

Zuul

什么是网关?

网关相当于一个网络服务架构的入口,所有网络请求必须通过网关转发到具体的服务。

网关的作用是什么

统一管理微服务请求,权限控制、负载均衡、路由转发、监控、安全控制黑名单和白名单等

Ribbon和Feign调用服务的区别

1、 调用方式同:Ribbon需要我们自己构建Http请求,模拟Http请求然后通过RestTemplate发给其他服务,步骤相当繁琐

2、而Feign则是在Ribbon的基础上进行了一次改进,采用接口的形式,将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,不需要自己构建Http请求了,直接调用接口就行了,不过要注意,调用方法要和本地抽象方法的签名完全一致。

负载均衡解决方案的分类

目前业界主流的负载均衡方案可分为两类:
第一类:集中式负载均衡,即在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施把访问请求通过某种策略转发至服务的提供方;
集中式负载均衡:
在这里插入图片描述

第二类:进程内负载均衡,将负载均衡逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一台合适的服务器。
进程内负载均衡:
在这里插入图片描述
ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

负载均衡策略

1、轮询策略(默认)(RoundRobinRule)RoundRobinRule
轮询策略表示每次都顺序取下一个provider,比如一共有5个provider,第1次取第1个,第2次取第2个,以此类推。

2、权重轮询策略—WeightedResponseTimeRule
(1)根据每个provider的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
(2)原理:一开始为轮询策略,并开启一个计时器,每30秒收集一次每个provider的平均响应时间,当信息足够时,给每个provider附上一个权重,并按权重随机选择provider权重越高的provider会被高概率选中。

3、随机策略(RandomRule)
从provider列表中随机选择一个provider。

4、最少并发数策略(BestAvailableRule)
选择正在请求中的并发数最小的provider,除非这个provider在熔断中。

5、在“选定的负载均衡策略”基础上进行重试机制(RetryRule)
(1)“选定的负载均衡策略”这个策略是轮询策略RoundRobinRule。
(2)该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择provider不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的provider。A失败了会去重试B。

6、可用性敏感策略(AvailabilityFilteringRule)
过滤性能差的provider,有两种:
第一种,过滤掉在erueka中一直处于连接失败的provider
第二种,过滤掉高并发的provider

7、区域敏感性策略(ZoneAvoidanceRule)
(1)以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider。
(2)如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。

eg:

@Configuration
public class RandomRuleConfig {
    @Bean
    public IRule randomRule() {
        return new RandomRule();
    }
}

需要注意的是,该Java配置类不能被@ComponentScan注解扫描到,否则该配置类就会被所有的Ribbon客户端所共享。换言之,Ribbon策略实例的Java配置类不要放在@ComponentScan注解所在的当前包及其子包下即可。如下所示,我们所有策略实例的Java配置类均放在ribbon包下,而SpringBoot启动类在order包下
在这里插入图片描述
通过@RibbonClients注解的defaultConfiguration属性来设置其全局的负载均衡策略,如下所示

@SpringBootApplication
// 使用Consul作为注册中心时使用
@EnableDiscoveryClient 
// 设置Ribbon全局负载均衡策略为随机策略
@RibbonClients(defaultConfiguration = RandomRuleConfig.class)
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

feign和openFeign区别

Feign集成了Ribbon、RestTemplate实现了负载均衡的执行Http调用,只不过对原有的方式(Ribbon+RestTemplate)进行了封装,开发者不必手动使用RestTemplate调服务,而是定义一个接口,在这个接口中标注一个注解即可完成服务调用,这样更加符合面向接口编程的宗旨,简化了开发。
OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。


OpenFeign的简单使用:https://zhuanlan.zhihu.com/p/409184804


什么是Spring Cloud Gateway?

Spring Cloud Gateway是Spring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。

gateway的组成有哪些?

路由 : 网关的基本模块,有ID,目标URI,一组断言和一组过滤器组成

断言:就是访问该旅游的访问规则,可以用来匹配来自http请求的任何内容,例如headers或者参数

过滤器:这个就是我们平时说的过滤器,用来过滤一些请求的,gateway有自己默认的过滤器,具体请参考官网,我们也可以自定义过滤器,但是要实现两个接口,ordered和globalfilter

什么是单点故障?

在分布式服务中,有一种最典型应用场景就是通过对集群进行Master选举,来解决分布式系统中的单点故障,什么是分布式系统中的单点故障:通常分布式系统采用主从模式,就是一个主机连接多个处理节点,主节点负责分发,从节点负责处理任务,当我们的主节点发生故障时,那么整个系统都会瘫痪了,那么我们把这种故障叫做单点故障。

=============================================================================

Redis面试题

说说Redis的基本数据结构类型(五种基本类型)?

String(字符串):String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象
Hash(哈希) :在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构,应用场景:缓存用户信息等。
List(列表) :列表(list)类型是用来存储多个有序的字符串,应用场景:消息队列,文章列表。
Set(集合):用来保存多个的字符串元素,但是不允许重复元素。应用场景:用户标签,生成随机数抽奖、社交需求。
zset(有序集合):已排序的字符串集合,同时元素不能重复。应用场景:排行榜,社交需求(如用户点赞)。

什么是缓存击穿、缓存穿透、缓存雪崩?
常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。

在这里插入图片描述

缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。

如何避免缓存穿透呢? 一般有三种方法。

1.如果是非法请求,我们在API入口,对参数进行校验,过滤非法值。
2.如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间。(业务上比较常用,简单有效)
3.使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。

缓存雪崩问题

缓存雪崩: 指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至down机。
缓存雪崩一般是由于大量数据同时过期造成的,对于这个原因,可通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值+一个较小的随机值,5小时+0到1800秒酱紫。Redis故障宕机也可能引起缓存雪奔。这就需要构造Redis高可用集群。

缓存击穿问题

缓存击穿:
指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。缓存雪崩是指数据库压力过大甚至down机,缓存击穿只是大量并发请求到了DB数据库层面。可以认为击穿是缓存雪崩的一个子集吧。有些文章认为它俩区别,是区别在于击穿针对某一热点key缓存,雪奔则是很多key。

Redis 的持久化机制有哪些?优缺点说说

Redis是基于内存的非关系型K-V数据库,既然它是基于内存的,如果Redis服务器挂了,数据就会丢失。为了避免数据丢失了,Redis提供了持久化,即把数据保存到磁盘。

RDB

RDB,就是把内存数据以快照的形式保存到磁盘上。什么是快照?可以这样理解,给当前时刻的数据,拍一张照片,然后保存下来。RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。在指定时间间隔内,将内存中的数据集快照写入磁盘中,其实际工作过程是,先创建一个子进程,将数据集写入一个临时文件,写入成功后,再替换掉之前的文件,用二进制压缩存储。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis重启的时候,通过加载dump.rdb文件来恢复数据。

RDB 的优点:

适合大规模的数据恢复场景,如备份,全量复制等;当数据集较大时,RDB的骑当效率比AOF更高

RDB缺点:

没办法做到实时持久化/秒级持久化;数据安全性低,因为RDB是隔一段时间才进行持久化,如果在这个间隔期间发生了故障,那么这期间的数据将会丢失。

AOF

AOF(append only file) 持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。用日志的形式记录服务器所处理的每一个写、删除操作,查询操作不记录,用文本的方式进行记录,可以打开文件看到详细的操作记录。默认是不开启的。

AOF的优点

数据的一致性和完整性更高,AOF有三种同步策略,数据安全性比RDB高;AOF通过append模式写文件,即使中途服务器宕机也不会破坏已存在的内容;

AOF的缺点

AOF记录的内容越多,文件越大,数据恢复变慢,AOF文件比RDB文件大,且恢复速度慢,运行效率比RDB低,不适用于数据集大的时候。

Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式。

主从模式:Redis部署了多台机器,有主节点,负责读写操作,有从节点,只负责读操作。从节点的数据来自主节点,实现原理就是主从复制机制。
哨兵模式:由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。但是呢,一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点问题),因此,可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行监控。

=============================================================================

Mysql面试题

什么是视图?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

什么是索引?在mysql中建索引的优缺点是什么?

官方定义:一种帮助mysql提高查询效率的数据结构
优点:大大加快数据查询速度 缺点: 维护索引需要耗费数据库资源
索引需要占用磁盘空间 当对表的数据进行增删改的时候,因为要维护索引,速度会受到影响
(会导致底层数据结构变化,需要进行重排序;所以一般只在常用的搜索字段上建立索引)

什么情况下需要建索引?

主键自动创建唯一索引较频繁的作为查询条件的字段查询中排序的字段,查询中统计或者分组的字段

什么情况下不建索引?

表记录太少的字段经常增删改的字段唯一性太差的字段,不适合单独创建索引。比如性别,民族,政治面貌

索引主要有哪几种分类?

MySQL主要的几种索引类型:1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引。
普通索引:是最基本的索引,它没有任何限制
唯一索引: 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值
组合索引: 一个索引包含多个列,实际开发中推荐使用组合索引
全文索引:全文搜索的索引。用于搜索很长一篇文章的时候,效果最好。

主键索引和唯一索引的区别:

主键必唯一,但是唯一索引不一定是主键; 一张表上只能有一个主键,但是可以有一个或多个唯一索引。

什么是最左匹配原则?

如果我们创建了(age, name)的组合索引,那么其实相当于创建了(age)、(age,name)两个索引,这被称为最佳左前缀特性。因此我们在创建组合索引时应该将最常用作限制条件的列放在最左边,依次递减。
最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

索引失效场景有哪些?

理解了上面聚集索引相对于非聚集索引的树的结构,对于什么时候索引会失效,理解起来就不那么难了。

  1. 组合索引未使用最左前缀,例如组合索引(age,name),where name='张三’不会使用索引;
  2. or会使索引失效。如果查询字段相同,也可以使用索引。例如where age=20 or age=30(索引生效),where age=20 or name=‘张三’(这里就算你age和name都单独建索引,还是一样失效);
  3. 如果列类型是字符串,不使用引号。例如where name=张三(索引失效),改成where name=‘张三’(索引有效);
  4. like未使用最左前缀,where A like ‘%China’;
  5. 在索引列上做任何操作计算、函数,会导致索引失效而转向全表扫描;
  6. 如果mysql估计使用全表扫描要比使用索引快,则不使用索引;

索引的设计原则

  1. 索引列的区分度越高,索引的效果越好。比如使用性别这种区分度很低的列作为索引,效果就会很差。
  2. 尽量使用短索引,对于较长的字符串进行索引时应该指定一个较短的前缀长度,因为较小的索引涉及到的磁盘I/O较少,查询速度更快。
  3. 索引不是越多越好,每个索引都需要额外的物理空间,维护也需要花费时间。
  4. 利用最左前缀原则。
    =============================================================================

Linux面试题

怎么查看当前进程?怎么查看当前路径?

答案:
查看当前进程:ps
查看当前路径:pwd

利用 ps 怎么显示所有的进程? 怎么利用 ps 查看指定进程的信息?

答案:
ps -ef (system v 输出)
ps -aux bsd 格式输出
ps -ef | grep pid

linux创建软连接命令?

ln -s [dir1] [dir2] ,dir1是真实的文件夹,dir2是dir1的软链接。

移动文件用哪个命令?改名用哪个命令?

答案:mv mv

列举几个常用的Linux命令

  1. 列出文件列表:ls【参数 -a -l】
  2. 创建目录和移除目录:mkdir rmdir
  3. 用于显示文件后几行内容:tail,例如: tail -n 1000:显示最后1000行
  4. 打包:tar -xvf
  5. 打包并压缩:tar -zcvf
  6. 查找字符串:grep
  7. 显示当前所在目录:pwd
  8. 创建空文件:touch
  9. 编辑器:vim vi
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值