首页 > 其他分享 >面试题

面试题

时间:2023-08-01 21:11:49浏览次数:29  
标签:面试题 重复 事务 索引 对象 数据 主键

数据库三大范式是什么

	-https://zhuanlan.zhihu.com/p/618012849
    -# 第一范式:1NF 是指数据库表的每一列都是不可分割
    	-每列的值具有原子性,不可再分割。
		-每个字段的值都只能是单一值
	-# 第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)
        如果表是单主键,那么主键以外的列必须完全依赖于主键,其它列需要跟主键有关系
        如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
        
     -# 第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式
        第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖
        不存在传递依赖

mysql有哪些索引类型,分别有什么作用

https://blog.csdn.net/ghost_hell/article/details/119822128
-主键索引(聚簇索引)---》主键,表不建立主键,也会有个隐藏字段是主键,是主键索引,mysql是基于主键索引构建的b+树,如果没有主键,如果按主键搜索,速度是最快的---》一定会有主键索引
    -辅助索引(普通索引)-->咱们给某个自己加索引,django  index=True,通过该字段查询,会提高速度,如果字段 变化小(性别,年龄),不要建立普通索引
    	-CREATE INDEX index_id ON tb_student(id);
    -唯一索引(unique)
    	-不是为了提高访问速度,而是为了避免数据出现重复
        -唯一索引通常使用 UNIQUE 关键字
    	-CREATE UNIQUE INDEX index_id ON tb_student(id);
    	
    -组合索引(联合索引)
    	-django 中:class Meta:
        -CREATE INDEX index_name
		ON table_name (column1, column2, column3);    			
    
    -全文索引-->基本不用---》
        全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。
        在 MySQL 中只有 MyISAM 存储引擎支持全文索引。
        全文索引允许在索引列中插入重复值和空值。
        不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。
        创建全文索引使用 FULLTEXT 关键字

3 事务的特性和隔离级别

	-https://www.cnblogs.com/liuqingzheng/p/16480047.html
    # 事务四大特性(ACID)
        原子性(Atomicity):数据库把“要么全做,要么全部做”的这种规则称为原子性
        隔离性(Isolation):事务之间相互隔离,不受影响,这与事务的隔离级别密切相关
            -事务隔离级别
        一致性(Consistency):事务执行前后的状态要一致,可理解为数据一致性
        持久性(Durable):事务完成之后,她对数据的修改是永恒的,即时出现故障也能够正常保持
        
   # 隔离级别---》为了保证四个特性的隔离性而有的
		-Read uncommitted(读未提交)-ru  :一个事物读到了另一个事务未提交的数据
		-Read committed(读已提交)-rc:如果设置了这个级别一个事物读不到另一个事务未提交的数据
        	-写事务提交之前不允许其他事务的读操作
         -Repeatable read(可重复读取)-rr:
        	-在开始读取数据(事务开启)时,不再允许修改操作,这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别
         -Serializable(串行化):求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行

脏读---------

https://www.cnblogs.com/liuqingzheng/p/16480047.html
脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
脏读就是读取到了不一定存在的的数据,比如事务A读取数据前,事务B更新了数据,事务A读取到了更新的数据,但是事务B又4回滚了,所以就出现了,读取到了数据库不存在的数据

不可重复读

不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
解释:事物B多次读取数据,在事务B读取数据的过程中,事务A对数据进行了修改并提交了,导致事务B度的数据不一致

幻读---------解决了不可重复读的问题了

事务B查询时,没有这条数据,但是事务A插入了这条数据,当事务B插入这条数据时,发现插入不成功,主键冲突,就像幻觉一样
  更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读

mysql5.7以后默认隔离级别是什么

REPEATABLE READ(可重复读)-RR-解决了脏读和不可重复读,存在幻读

##每个隔离级别解决了什么问题
	Read uncommitted(读未提交)-ru:存在脏读,不可重复读,幻读
	Read committed(读已提交)-rc: 解决了脏读,但存在不可重复读,幻读
	Repeatable read(可重复读取)-rr:解决了不可重复读,但存在幻读
	Serializable(串行化):解决了脏读,不可重复读和幻读问题,牺牲了效率
#Oracle仅支持两种隔离级别:
	Read Committed:读已提交
    Serializable:默认基本为RC  存在不可重复读问题
#查询隔离级别的命令:
mysql5.7及之后版本
		show variables like 'transaction_isolation';
    	select @@transaction_isolation;
mysql5.7之前版本
	show variables like 'tx_isolation';
    select @@tx_isolation;

什么是qps,tps,并发量,pv,uv

#QPS Queries Per Second 
	每秒查询率,一台服务器每秒能够响应的查询次数,每秒的响应请求数也即是最大吞吐能力。
    如何估算自己项目的QPS?
    	
#TPS Transactions Per Second 
	是每秒处理的事务数,包括一条消息入和一条消息出,加上一次用户数据库访问
    TPS 的过程包括:客户端请求服务端、服务端内部处理、服务端返回客户端。
	也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,

##并发数(并发度):
	指系统同时能处理的请求数量,同样反应了系统的负载能力。这个数值可以分析机器1s内的访问日志数量来得到
    系统同时处理的请求或事务数,可以直接理解为:系统同时处理的请求数量
    QPS = 并发量 / 平均响应时间
    并发量 = QPS * 平均响应时间
    例如当前系统QPS为1w,每个请求的响应时间都是2s,那么并发量就是2w 
##PV(Page View):
	页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次。可以统计服务一天的访问日志得到。
#UV(Unique Visitor):
	独立访客,统计1天内访问某站点的用户数。可以统计服务一天的访问日志并根据用户的唯一标识去重得到。
#响应时间(RT):
	响应时间是指系统对请求作出响应的时间,一般取平均响应时间。可以通过Nginx、Apache之类的Web Server得到。
#DAU(日活)
	DAU(Daily Active User),日活跃用户数量。常用于反映网站、app、网游的运营情况。
	DAU通常统计一日(统计日)之内,登录或使用了某个产品的用户数(去除重复登录的用户),与UV概念相似
 #MAU(月活)
	  MAU(Month Active User):月活跃用户数量,指网站、app等去重后的月活跃用户数量

什么是接口幂等性问题,如何解决?

   接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
解决方法:
https://zhuanlan.zhihu.com/p/345512692
https://blog.csdn.net/Weixiaohuai/article/details/114896111
-幂等:幂等(idempotent、idempotence)是一个数学与计算机学概念
        -一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同
        -接口幂等性:无论调用多少次,产生的效果是一样的
            -get 获取数据天然幂等
            -put 修改数据天然幂等
            	-修改库存(数字加减):不幂等
            -delete 删除 天然幂等
            -post 新增数据,会出现不幂等的情况,要把它做成幂等性的

#通过token 机制实现接口的幂等性,这是一种比较通用性的实现方法。
	3.1客户端会先发送一个请求去获取 token,服务端会生成一个全局唯一的 ID 作为 token 保存在 redis 中,同时把这个 ID 返回给客户端
	3.2客户端第二次调用业务请求的时候必须携带这个 token
	3.3服务端会校验这个 token,如果校验成功,则执行业务,并删除 redis 中的 token
	3.4如果校验失败,说明 redis 中已经没有对应的 token,则表示重复操作,直接返回指定的结果给客户端
#防重表    解决新增数据
	 使用订单号orderNo做为去重表的唯一索引,把唯一索引插入去重表,再进行业务操作,且他们在同一个事务中。这个保证了重复请求时,因为去重表有唯一约束,导致请求失败,避免了幂等问题。这里要注意的是,去重表和业务表应该在同一库中,这样就保证了在同一个事务,即使业务操作失败了,也会把去重表的数据回滚。这个很好的保证了数据一致性。
 # 前端:
按钮只能点击一次

什么是gil锁,有什么作用

	GIL:Global Interpreter Lock又称全局解释器锁。简单来说是一个互斥锁,每个线程在执行的过程中都需要先获取GIL,作用就是限制多线程同时执行,使得在同一进程内任何时刻仅有一个线程在执行。

python的垃圾回收机制是什么样的

python的垃圾回收机制简称GC机制,主要有三种方式
#引用计数:
	如果有新的引用指向对象,这个对象的引用计数就加一,引用销毁时,对象有引用计数就减一,当对象的引用计数为零时,该内存就释放
#标记清除
	首先标记对象(垃圾检测),然后清除垃圾(垃圾回收)
》首先初始所有对象标记为白色,并确定根节点对象(这些对象是不会被删除),标记它们为黑色(表示对象有效)。
将有效对象引用的对象标记为灰色(表示对象可达,但它们所引用的对象还没检查),检查完灰色对象引用的对象后,
将灰色标记为黑色。重复直到不存在灰色节点为止。最后白色结点都是需要清除的对象
#分代回收
	垃圾回收器会更频繁的处理新对象。一个新的对象即是你的程序刚刚创建的,而一个老的对象则是经过了
几个时间周期之后仍然存在的对象。Python会在当一个对象从零代移动到一代,或是从一代移动到二代的过程中提升
(promote)这个对象

解释为什么计算密集型用多进程,io密集型用多线程

https://zhuanlan.zhihu.com/p/151855962
#什么计算密集型用多进程
	而因为计算密集型任务,CPU几乎不存在空闲时间,使用python多线程,CPU频繁在各个线程之间切换所需时间反而会大大降低程序执行效率。而采用python多进程,可以实现真正意义上的并行处理,因此,计算密集型任务,采用python多进程更合适。
#io密集型用多线程
	多线程是共享资源的,因此通信更方便,而多进程之间的资源相互独立,通信不是很方便,因此,综合来看,IO密集型任务,采用python多线程更合适。

标签:面试题,重复,事务,索引,对象,数据,主键
From: https://www.cnblogs.com/zxjwt/p/17599097.html

相关文章