一、数据库优化
大数据表分页查询优化 浅分页 深分页 Id 大数据表分表 分表后查询/分页查询 索引优化 where 设置组合索引,根据查询条件热度来排序 避免索引失效 1)遵循最佳左前缀法则:如果使用组合索引,查询条件必须按组合索引字段排序 2)不在索引列上做任何计算操作 3)使用like时不要以通配符开头 4)不要使用is not null或者!= 5)存储引擎不能使用索引中范围条件右边的列 6)不要使用OR 排序优化 where+orderby 设置组合索引,根据查询条件热度来排序 满足最左前缀法则 连表查询优化 A left join B A为驱动表,必须全表扫描 把数据量少的表作为驱动表,右边大数据表连表字段建立索引 分组优化 group by where group by设置组合索引,根据查询条件热度来排序 满足最左前缀法则 开启慢查询日志
二、Rabbitmq三大问题解决思路
消费堆积:消费者故障、消费者消费慢 临时处理 1、如果是由于消费者故障引起,先恢复消费者 2、增加消费者消费消息 3、增加临时消费者先将队列数据写入数据库中,低峰或空闲时将数据库消息重新加载到队列中进行消费 处理完成以后 1、优化消费者,提高消费者消费速度 消息重复消费问题:生产者重复发送消息、消费者重复消费 1、为每一条消息增加一个唯一ID,消费时判断redis中是否存储这个ID,存在则丢弃,不存在则消费,并将ID存入redis 2、设计消费方法幂等性 消息丢失问题 1、开启生产者应答模式,开启数据持久化 2、开启消费者手动应答模式 3、使用集群
三、C#基础
1>静态构造函数(执行一次,调用静态成员或实例化时执行一次) 2>抽象类和接口的区别 1:抽象类有字段,构造函数,非抽象方法,接口没有 2:抽象类不可多继承,接口可以 3:接口成员默认修饰符为public,不可显示声明其他修饰符,抽象类成员可使用多种访问修饰符 3>值类型(int,float,dobule,bool,char,stru)直接存放在栈上,引用类型(string,interface,class,detegate,event)地址引用存放在栈上,数据存放在堆上。当值类型作为引用类型的成员时,可能数据会被存放到堆上,垃圾回收器会自动回堆上的数据 当栈上的引用地址超出作用域或者被销毁时,对堆上的引用会被删除,而垃圾回收器的机制是回收堆上没有被引用的数据 装箱:把值类型转换成引用类型 拆箱:把引用类型转换成值类型 装箱:对值类型在堆中分配一个对象实例,并将该值复制到新的对象中。 (1)第一步:新分配托管堆内存(大小为值类型实例大小加上一个方法表指针。 (2)第二步:将值类型的实例字段拷贝到新分配的内存中。 (3)第三步:返回托管堆中新分配对象的地址。这个地址就是一个指向对象的引用了。 拆箱:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。 在装箱时是不需要显式的类型转换的,不过拆箱需要显式的类型转换。 int i=0; System.Object obj=i; //这个过程就是装箱!就是将 i 装箱! int j=(int)obj;//这个过程 obj 拆箱! 4>const和readonly有什么区别? 都可以标识一个常量。主要有以下区别: 1、初始化位置不同。const必须在声明的同时赋值;readonly即可以在声明处赋值; 2、修饰对象不同。const即可以修饰类的字段,也可以修饰局部变量;readonly只能修饰类的字段 3、const是编译时常量,在编译时确定该值;readonly是运行时常量,在运行时确定该值。 4、const默认是静态的;而readonly如果设置成静态需要显示声明 5、修饰引用类型时不同,const只能修饰string或值为null的其他引用类型;readonly可以是任何类型。 5>1byte=2V8(0-255)=1个字符=0.5个汉字 6>ref外部初始化 out内部初始化 7>&和&&都可作为逻辑与,但是&&具有短路功能 8>class可以被实例化,属于引用类型, class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的 struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的. 9>new关键字的作用 运算符:创建对象实例 修饰符:在派生类定义一个重名的方法,隐藏掉基类方法 约束:泛型约束定义,约束可使用的泛型类型 10>C#中类(class)与结构(struct)的异同? class可以被实例化,属于引用类型, class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的 struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的 11>C# 中static关键字的作用? 对类有意义的字段和方法使用static关键字修饰,称为静态成员,通过类名加访问操作符“.”进行访问; 对 类的实例有意义的字段和方法不加static关键字,称为非静态成员或实例成员。 注: 静态字段在内存中只有一个拷贝,非静态字段则是在每个实例对象中拥有一个拷贝。而方法无论是否 为静态,在内存中只会有一份拷贝,区别只是通过类名来访问还是通过实例名来访问。 12>虚函数:有方法体,在子类中可选择性重写,抽象函数:只有定义,必须在子类中重写 13>能用foreach遍历访问的对象的要求 需要实现IEnumerable接口或声明GetEnumerator方法的类型 14>is和as有什么区别? 在C#中,is是用来判断类型A能否转化为类型B,一般用来作有继承关系的父类与子类是 否可以相互转化的判断。而as是将类型A转化为类型B,一般也是用来做子类与父类的转换 15>new关键字作用 1、创建对象 2、隐藏父类成员 3、约束 16>MySQL有多种存储引擎(主要有MyISAM,InnoDB(默认)) InnoDB 支持事务,MyISAM 不支持 InnoDB 支持外键,而 MyISAM 不支持 InnoDB 必须要有主键,MyISAM可以没有主键 17>聚集索引:只能有一个,字段值只必须唯一,一般为主键,索引记录为物理顺序 非聚集索引:可有多个,字段值不要求唯一,索引记录为逻辑顺序 索引合并的限制就是只能用单表条件,多表查询时如果使用多表条件,索引会失效,可以使用union
标签:八股文,索引,查询,面试,实例,引用,类型,内存 From: https://www.cnblogs.com/daiwk/p/18108630