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
      
  • 相关阅读:
    c#线程带参数
    svn自动update到指定目录
    204. 计数质数
    178. 分数排名
    387. 字符串中的第一个唯一字符
    374. 猜数字大小
    371. 两整数之和
    350. 两个数组的交集 II
    326. 3的幂
    219. 存在重复元素 II
  • 原文地址:https://www.cnblogs.com/801-sm726/p/12371281.html
Copyright © 2011-2022 走看看