腾讯云(pc产品部)-后台开发(校招)-一面
20210723:
1、是否能在深圳实习
2、介绍下项目
3、开发语言
4、做的具体项目优化
数据库优化包括数据库表结构优化、SQL语句优化、分区、分表、索引优化等。
1)表结构优化:数据类型的使用(尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销,尽量使用数字型字段),结构设计(表的结构)、设计数据库表的时候需不需要创建外键,为搜索字段建索引等
2)SQL语句优化:SQL语句处理逻辑的优化,而且还要根据索引进行配合使用
3)分表:分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。数据库读写操作的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
例如:用户表
用户的角色有很多种,可以通过枚举类型的方式将用户分为不同类别category:学生、教师、企业等 ,这样的话,我们就可以根据类别category来对数据库进行分表,这样的话每次查询的时候现根据用户的类型锁定一个较小的范围。
缺点:不过分表之后,如果需要查询完整的顺序就需要使用多表操作了。
4)分库:分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。数据库读写操作的时候操作的还是大表名字,DMS自动去组织分区的数据。
5)索引优化:索引的大致原理是在数据发生变化的时候就预先按指定字段的顺序排列后保存到一个类似表的结构中,这样在查找索引字段为条件记录时就可以很快地从索引中找到对应记录的指针并从表中获取到相应的数据,这样速度是很快地。
缓存:分离数据库中活跃的数据,思想就是一个很明显的分离数据库中活跃的数据的使用案例,将热门数据缓存在内存中。
读写分离:读写分离的实质是将应用程序对数据库的读写操作分配到多个数据库服务器上,从而降低单台数据库的访问压力。读写分离一般通过配置主从数据库的方式,数据的读取来自从库,对数据库增加修改删除操作主库。
分布式部署数据库:将表存放在不同的数据库中然后再放到不同的数据库中,这样在处理请求的时候,如果需要调用多个表,则可以让多台服务器同时处理,从而提高处理效率。
应用服务和数据服务分离:应用服务器和数据库服务器进行分离的目的是为了根据应用服务器的特点和数据库服务器的特点进行底层的优化,这样的话能够更好的发挥每一台服务器的特性,数据库服务器当然是有一定的磁盘空间,而应用服务器相对不需要太大的磁盘空间,这样的话进行分离是有好处的,也能防止一台服务器出现问题连带的其他服务也不可以使用。
进行业务的拆分:将业务数据表部署到不同的服务器上,分别查找对应的数据以满足网站的需求。各个应用之间用过指定的URL连接获取不同的服务。
例如:一个大型的购物网站就会将首页、商铺、订单、买家、卖家等拆分为不通的子业务,一方面将业务模块分归为不同的团队进行开发,另外一方面不同的业务使用的数据库表部署到不通的服务器上,体现到拆分的思想,当一个业务模块使用的数据库服务器发生故障也不会影响其他业务模块的数据库正常使用。另外,当其中一个模块的访问量激增的时候还可以动态的扩展这个模块使用到的数据库的数量从而满足业务的需求。
5、mysql大规模分布式的存储方案
6、一致性哈希算法
参考:根据哈希函数构造一个哈希环,通过hash(服务器A的IP地址) % 2^32,将数据节点依次映射到这个环上,对需要插入的数据先求哈希,再顺时针沿着哈希环,找到第一个实际节点,数据将存储到该实际节点上。一致性Hash算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性。
但是会存在数据分布不均匀(数据倾斜)的情况,引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。
https://zhuanlan.zhihu.com/p/83522748
7、项目有多少节点
8、用epoll进行网络I/O操作,为什么不用别的api或方式去做?
9、static的作用
参考:
static的意思是静态的,可以用来修饰变量,函数和类成员。
- 变量:被static修饰的变量就是静态变量,它会在程序运行过程中一直存在,会被放在静态存储区。局部静态变量的作用域在函数体中,全局静态变量的作用域在这个文件里。
- 函数:被static修饰的函数就是静态函数,静态函数只能在本文件中使用,不能被其他文件调用,也不会和其他文件中的同名函数冲突。
- 类:而在类中,被static修饰的成员变量是类静态成员,这个静态成员会被类的多个对象共用。被static修饰的成员函数也属于静态成员,不是属于某个对象的,访问这个静态函数不需要引用对象名,而是通过引用类名来访问。
【note】静态成员函数要访问非静态成员时,要用过对象来引用。局部静态变量在函数调用结束后也不会被回收,会一直在程序内存中,直到该函数再次被调用,它的值还是保持上一次调用结束后的值。
注意和const的区别。const强调值不能被修改,而static强调唯一的拷贝,对所有类的对象都共用。
10、struct和class的区别
参考:* C++中的struct对C中的struct进行了扩充,struct能包含成员函数、继承、实现多态
- 默认的访问控制不同:使用struct时,它的成员的访问权限默认是public的,而class的成员默认是private的。struct的继承默认是public继承,而class的继承默认是private继承
- struct可以继承class,同样class也可以继承struct,public继承还是private继承,取决于子类而不是基类。
- class可以用作模板,而struct不能
- struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。
11、有写过模板代码吗
12、声明一个struct/空类,没有任何成员,struct占多少空间
参考:
- 在部分C编译器中,要求结构至少有一个成员。
- 在C++编译器中,根据网友的说法,因为C++标准规定,任何不同的对象不能拥有相同的内存地址。对于空类或空结构体,编译器会加一个字节来区别,故其大小为1。
- sizeof(空类/空结构体) = 1; 空类,没有任何成员变量或函数,即没有存储任何内容;但是由于空类仍然可以实例化
- 一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址。这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)。