zoukankan      html  css  js  c++  java
  • 网编并发数据库面试题

    Python面试重点(进阶篇)

    注意:只有必答题部分计算分值,补充题不计算分值。

    第一部分 必答题

    1. 简述 OSI 7层模型及其作用?(2分)

      应用层(表示层和会话层合为应用层) - 传输的数据内容 https/htpp协议
      表示层
      会话层
      传输层  -UDP/TCP协议  --四层交换机、四层路由器  -- 对应端口(对方的、自己的)
      网络层  - ipv4/ipv6协议 --路由器、三层交换机   -- 对应的ip地址(对方的、自己的)
      数据链路层 - mac/arp协议  -网卡、二层交换机  - 对应mac地址(对方的、自己的)
      物理层 - 转换成二进制
      # 经常说的交换机默认是二层交换机,上层的交换机能兼容下层交换机的性能
      
    2. 简述 TCP三次握手、四次回收的流程。(3分)

    3. TCP和UDP的区别?(3分)

      tcp:
      	使用场景:上传、下载、发邮件,实时通信
      	特点:可靠(内部有重传机制,数据不会丢失)、面向连接、速度慢、能传递的数据长度不受限制
      udp:
      	使用场景:短消息、在线观看视频、即时通信工具
      	特点:不可靠、面向数据报、速度快、能传递的数据长度受限、一对一、一对多、多对多(不管对方在不在,直接发送,不占连接,随时可以收发消息)
      
    4. 什么是黏包?(2分)

      当多条消息发送时接收变成了一条或者出现了接收不准确的情况
      
    5. 什么 B/S 和 C/S 架构?(2分)

      B/S:
      	B:browser-浏览器
      	S:server-服务端
      C/S:
      	C:client-客户端
      	S:server-服务端
      
    6. 请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

      server端:
      import socket
      sk = socket.socket(type = socket.SOCK_DGRAM)
      sk.bind('127.0.0.1',9000)
      
      while True:
          msg.cli_addr = sk.recvfrom(1024)   # recvfrom可以接收地址和端口号,通过解构将传输内容和地址、端口号进行分别定义
          print(msg.decode('utf-8'))
          msg = input(">>>")             # 根据用户的输入可以任意发送内容
          if msg.upper() == "Q":
              continue         # 跳出本次循环,执行下次可以实现多人通信
          sk.sendto(msg.encode('utf-8'),cli_addr)
          
      client端:
      from socket import socket,SOCK_DGRAM 
      sk = socket(type = SOCK_DGRAM)
      server_addr = ('127.0.0.1',9000)
      
      while True:
      	mag = input(">>>")
      	if msg.upper() == "Q":
      	     break
      	 sk.sendto(msg.encode('utf-8'),server_addr)
      	 msg = sk.recv(1014)
      	 print(msg.decode('utf-8'))
      
    7. 简述进程、线程、协程的区别?(3分)

      线程:是在计算机内部能够被CPU调度的最小单元
      进程:是计算机资源分配的最小单元
      协程:不是真实存在的,是程序员自己编写的,被称为"微线程",实际上一个线程轮流的执行以下操作
      联系:他们都是提高并发,一个进程中可以有多个线程,一个线程总也可以有多个协程,同一个进程中的线程可以共享此进程中的资源,单纯的协程没有提高高并发的作用,只要代码之间的切换而已,要配合I/O切换,协程才有意义
      
    8. 什么是GIL锁?(2分)

      GIL:全局解释器锁,只有python有,保证不了数据安全
      GIL:同一时刻保证只有一个线程可以被CPU调度,在python开发时要注意使用多线程、多进程的使用
      
    9. 进程之间如何进行通信?(2分)

      from multiprocessing import Queue,Process
      def son(q):
           print(q.get())           # 接收实例化对象给的值123
      
      if __name__ == '__main__':
           q = Queue()
           p = Process(target=son,args=(q,))
           p.start()
           q.put(123)       # 给实例化对象给一个值123
      
    10. Python如何使用线程池、进程池?(2分)

      线程池: from concurrent futures import TheradPoolExeator
      进程池: from concurrent futures import  ProcessPoolExeator
      
    11. 请通过yield关键字实现一个协程? (2分)

      
      
    12. 什么是异步非阻塞? (2分)

      异步:一个程序执行完了再调用另一个,但是不等这个程序执行完毕
      非阻塞:不在当子进程执行完毕再执行父进程,有I/O阻塞的情况就执行其他子进程或者父进程
      
    13. 什么是死锁?如何避免?(2分)

      死锁:Lock锁两次或者多个锁交叉使用
      避免:
      
    14. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

      import threading
      import time
      def _wait():
      	time.sleep(60)
      # flag a
      t = threading.Thread(target=_wait)
      t.setDeamon(False)
      t.start()
      # flag b
      # setDeaon是守护进程开启守护进程的状态为False,运行时间为60.xxx秒
      
    15. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

      import threading
      import time
      def _wait():
      	time.sleep(60)
      # flag a
      t = threading.Thread(target=_wait)
      t.setDeamon(True)
      t.start()
      # flag b
      # setDeaon是守护进程,开启守护进程的状态为True,执行时间为0.xxx秒,
      # 守护进程会随着父进程的代码结束而结束
      
    16. 程序从flag a执行到falg b的时间大致是多少秒?(2分)

      import threading
      import time
      def _wait():
      	time.sleep(60)           # 子进程
      # flag a
      t = threading.Thread(target=_wait)   # 父进程
      t.start()
      t.join()
      # flag b   
      # join是阻塞,当子进程执行完毕再执行父进程,60.xxxx秒
      
    17. 读程序,请确认执行到最后number是否一定为0(2分)

      import threading
      loop = int(1E7)
      def _add(loop:int = 1):
      	global number
      	for _ in range(loop):
      		number += 1
      def _sub(loop:int = 1):
      	global number
      	for _ in range(loop):
      		number -= 1
      number = 0
      ta = threading.Thread(target=_add,args=(loop,))
      ts = threading.Thread(target=_sub,args=(loop,))
      ta.start()
      ta.join()
      ts.start()
      ts.join()
      # number为0,join是当子进程执行完毕后才执行父进程,一个子进程是将number循环加1E7次,而_sub子进程是将number循环减1E7次,最后结果number还是为0
      
    18. 读程序,请确认执行到最后number是否一定为0(2分)

      import threading
      loop = int(1E7)
      def _add(loop:int = 1):
      	global number
      	for _ in range(loop):
      		number += 1
      def _sub(loop:int = 1):
      	global number
      	for _ in range(loop):
      		number -= 1
      number = 0
      ta = threading.Thread(target=_add,args=(loop,))
      ts = threading.Thread(target=_sub,args=(loop,))
      ta.start()
      ts.start()
      ta.join()
      ts.join()
      # number结果不为0
      
    19. MySQL常见数据库引擎及区别?(3分)

      innodb:索引+数据、表结构、数据的持久化存储,支持事务、行级锁、外键
      myisam:frm表结构、MYD表数据、MYI表索引、数据的持久化存储,具有表级锁
      memory:只能做缓存,特点:表结构、数据断电消失
      
    20. 简述事务及其特性? (3分)

      事务:transacitions
      特性:原子性、一致性、隔离性、持久性
      
    21. 事务的隔离级别?(2分)

      读未提交
      读提交
      可重复读
      串行化
      
    22. char和varchar的区别?(2分)

      char -- 定长字符串 -- 0-255字节
      varchar -- 变长字符串  -- 0-65535字节
      
    23. mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)

      char -- 定长字符串 -- 0-255字节
      varchar -- 变长字符串  -- 0-65535字节
      varchar(50)50代表的字符串的长度限制
      
    24. MySQL中delete和truncate的区别?(2分)

      
      
    25. where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)

      (a)
      (b)
      (c)
      (a,b)
      (b,c)
      (a,c)
      (a,b,c)
      # (a,b,c)
      
    26. 组合索引遵循什么原则才能命中索引?(2分)

      条件用and相连、服从最左前缀原则(最左边字段带有命中索引,腰带有最左边字段去查找)
      
    27. 列举MySQL常见的函数? (3分)

      countmaxminavgsumconcat
      
    28. MySQL数据库 导入、导出命令有哪些? (2分)

      导出某个数据库:
      	mysqldump -u root -p dbname > sqlfilepath
      导出多个数据库:
      	mysqldump -u root -p -database dbname1  dbname2  ...  >sqlfilepath
      导出某个数据库的某个表:
      	mysqldump -u root -p dbname tablename > sqlfilepath
      导入未连接的数据库:
      	mysql -h ip u username  -p  dbname  <  sqlfilepath
      导入已连接数据库时方法:
      	source sqlfilepath
      
    29. 什么是SQL注入?(2分)

      当数据使用字符串格式化时,当select时定义任意的字符,当出现--时,sql会以为是语句的结束,--后面的语句会被当做注释,设置的密码不会被执行,当客户端输入任意的用户名和密码都会登录成功,所以会出现数据不安全的现象
      
    30. 简述left join和inner join的区别?(2分)

      left join:左外连接,以左边表为基准进行匹配,左表中的内容全部保存
      inner join:内连接,所有不在条件匹配内的所有数据,都会被提出连表中
      
    31. SQL语句中having的作用?(2分)

      having:过滤
      
    32. MySQL数据库中varchar和text最多能存储多少个字符?(2分)

       varchar:0-65535字节
      
    33. MySQL的索引方式有几种?(3分)

      辅助索引
      聚焦索引
      
      主键索引
      唯一索引
      普通索引
      联合索引
      全文索引
      
      
    34. 什么时候索引会失效?(有索引但无法命中索引)(3分)

      范围大、使用函数、参与运算
      
    35. 数据库优化方案?(3分)

      1. 分析SQL语句,优化SQL语句
      2. 在表结构中尽量不要出现冗余数据
      3. 根据业务场景选择合适的引擎
      4. 使用索引提高查询的效率
      5. 使用连接代替子查询
      6. 分表(水平分表、垂直分表)
      多机:读写分离(集群,让多台复为其提供服务)
      	 分布式(把不同的业务分给不同的集群处理)
      7.应用缓存,减轻mysql的压力
      
    36. 什么是MySQL慢日志?(2分)

    37. 设计表,关系如下: 教师, 班级, 学生, 科室。(4分)
      科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。

      1.  写出各张表的逻辑字段
      2.  根据上述关系表
          a.查询教师id=1的学生数
          b.查询科室id=3的下级部门数
          c.查询所带学生最多的教师的id
      
    38. 有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)

    39. 根据表关系写SQL语句(10分)

      1582763529750

      • 查询所有同学的学号、姓名、选课数、总成绩;

        select 
        
      • 查询姓“李”的老师的个数;

        select count from teacher where tname like "李__"
        
      • 查询平均成绩大于60分的同学的学号和平均成绩;

      • 查询有课程成绩小于60分的同学的学号、姓名

      • 删除学习“叶平”老师课的score表记录;

      • 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;

      • 查询每门课程被选修的学生数;

      • 查询出只选修了一门课程的全部学生的学号和姓名;

      • 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;

      • 查询两门以上不及格课程的同学的学号及其平均成绩;

    第二部分 补充题

    1. 什么是IO多路复用?

    2. async/await关键字的作用?

    3. MySQL的执行计划的作用?

    4. 简述MySQL触发器、函数、视图、存储过程?

    5. 数据库中有表:t_tade_date

      id		tade_date
      1		2018-1-2
      2		2018-1-26
      3		2018-2-8
      4		2018-5-6
      ...
      输出每个月最后一天的ID
      
  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/801-sm726/p/12371281.html
Copyright © 2011-2022 走看看