面试必问题目

Python:

1、列表,元组,字典的区别是什么?

2、介绍一下Python的装饰器?

3、什么是Python匿名函数?

4、介绍一下Python的闭包?

5、Python的self是什么?

6、深拷贝与浅拷贝有什么区别?

7、如何在Python中实现多线程?

8、介绍一下Python的垃圾回收机制?

9.sort 与 sorted 区别:

10.基础

#!/usr/bin/python
# -*-coding:utf-8 -*-
 
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象

c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝
 
a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象

print(id(a),id(c),id(d))
print( 'a = ', a )
print( 'c = ', c )
print( 'd = ', d )

dict5=dict(zip(['one', 'two', 'three'], [1, 2, 3])) 
for i,k in dict5.items():
	print(i,k)
print(min(dict5.values()))

class A(object):
	bar=4
a=A()
setattr(a,'bar',5)
print(getattr(a,'bar'))

x=['2','0','df']
it = iter([1,2,3])
myslice = slice(4)
arr =range(9)
print(arr[myslice])
print(id(x))
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(enumerate(seasons))
a=input("input:---")
a=int(a)
print(int('12',16))
print(oct(20))
print(bin(10))
print(ord('a')) #97 
class C(object):
    @staticmethod
    def f():
        print('runoob');
 
C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()        # 也可以实例化后调用
eval('print(pow(2,2))')
exec("""for i in range(5):
			print(i)
""")
import os
print(os.getcwd())
def is_odd(n):
    return n % 2 == 1

tmplist = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]))
print(tmplist)

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3


a = bytes([1,2,3,97])
print(a)
print(bytearray([1,2,3]))
import time
print("www","runoob","com",sep=".")

print("{1} {0} {1}".format("hello", "world"))



str1="abcd" #编码
print(str1.encode())
str2 = "我爱你"
print(str2.encode()) #默认utf-8 1个汉字3个字节
print(str2.encode("gbk"))


b=b'\xe6\x88\x91'
print(b.decode("utf-8"))
print(str(b,"utf-8"))

print(complex(1,2))

str = "for i in range(5): print(i)"
c=compile(str,'','exec') # 编译为字节代码对象 
exec(c)

def square(x) :           
	return x ** 2
print(map(square,[1,2,3]))

a = [1,2,3]
b = [4,5,6]
zipped = zip(a,b) 
print(list(zipped))

s = 'RUNOOB'
print(repr(s))

print ("round(80.264, 2) : ", round(80.264, 2))


seqString = 'Runoob'
print(list(reversed(seqString)))

print(hash('test'))
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

***计算机网络:***(重点考察TCP协议和HTTP协议)

1、介绍一下五层、OSI七层,每一层举出一个应用实例。
物理层 :确保原始的数据可在各种物理媒介上传输 【ppp Mac Vlan 】【中继器、集线器】
数据链路层 :【帧】 在不可靠的物理介质上提供可靠的传输 【流量控制、数据检错、重发】【网桥、交换机】
网络层 :实现两个主机系统之间的数据传送 【路径选择、寻址】【不可靠、无连接】【IP ARP ICMP OSPF RIP 】【路由器】
传输层 :为应用进程之间提供端到端的数据通信 、流量控制、差错控制 【TCP UDP 】【网关】
应用层 【报文】【FTP DNS Telnet HTTP NFS 】
会话层 :管理主机之间的会话进程 ,负责建立、管理、终止进程之间的会话
表示层 : 数据的加密 、压缩、格式转换
应用层: 为用户的应用程序提供网络服务的接口。
在这里插入图片描述
在这里插入图片描述

2、TCP和UDP有什么区别,和应用场景?

区别:
TCP面向连接,UDP面向非连接即发送数据前不需要建立链接
TCP提供可靠的服务(数据传输),UDP无法保证
TCP面向字节流,UDP面向报文
TCP数据传输慢,UDP数据传输快
在一个TCP连接中,仅有两方进行彼此通信,因此广播和多播不能用于TCP

TCP使用校验和,确认和重传机制来保证可靠传输
TCP使用累积确认
TCP使用滑动窗口机制来实现流量控制,通过动态改变窗口的大小进行拥塞控制

场景:

oracle :1521 mysql :3306 redis :6379
TCP对应的协议:

FTP:定义了文件传输协议,使用21端口。
Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
HTTP:是从Web服务器传输超文本到本地浏览器的传送协议,端口默认80。
RDP:远程桌面协议 3389
RPC:远程过程调用 135
SSH : 22
SMB :文件和打印共享 139 445
sockets : 1080 
UDP对应的协议:

DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
TFTP(Trival File TransferProtocal),简单文件传输协议,该协议在熟知端口69上使用UDP服务。

字节流和数据报区别?

所谓的“流模式”,是指TCP发送端发送几次数据和接收端接收几次数据是没有必然联系的
所谓的“数据报模式”,是指UDP发送端调用了几次 write,接收端必须用相同次数的 read 读完

TCP流量控制和拥塞控制

流量控制主要针对的是端到端传输中控制流量大小并保证传输可靠性(未收到ack就不滑动)。流量控制往往是指点对点通信量的控制,所要做的是抑制发送端发送数据的速率。
拥塞控制主要是一个全局性过程,涉及到所有主机,路由器,以及与降低网络传输性能有关的所有因素。防止过多的数据注入到网络中。如果有发生丢包则通过拥塞控制减小窗口,确定出合适(慢启动 拥塞避免 快重传 快恢复)的拥塞窗口(增性加乘性减)。

3、TCP的三次握手和四次挥手,为什么是三次和四次?https://blog.csdn.net/qzcsu/article/details/72861891

三次握手的目的是同步连接双方的序列号和确认号并交换TCP窗口大小信息

在这里插入图片描述
在这里插入图片描述

TCP time_wait 作用
1、可靠地实现TCP的连接终止。
在终止TCP连接时有4个报文需要交换,其中最后一个ACK报文是由客户端发往服务器。假设这个ACK报文在网络中被丢弃了,那么服务器端收不到这个确认ACK,服务器端会向客户端再次发送FIN。这就是为什么TIME_WAIT状态持续2倍的最长报文段生存时间:1MSL时间留给最后的ACK确认报文段到达服务器端,1MSL时间留给服务器端再次发送的FIN2、确保老的重复的报文段在网络中过期失效,这样建立新的连接时将不再接受它们。
TCP协议采用的是出错重传,也就是会生成重复的报文,并且根据路由器的选择,这些重复的报文可能在连接终止后才到达,如果客户端/服务器端收到这个老的报文会把它误认为一个同一连接的新的报文,然后对这个报文进行处理,这样就会出现错误。从状态转换图我们可以看到从TIME_WAIT到连接终止,中间有2MSL,这个时间足以让老的重复的报文段过期失效。

4、HTTP和HTTPS有什么区别?

https 数据经过了加密 多了 SSL/TLS 层
端口不同 80 443
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

5、打开了http://www.baidu.com,发生了什么?https://www.cnblogs.com/xianlei/p/tcpip_http.html
在这里插入图片描述

1、应用层:客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。
在这里插入图片描述
在这里插入图片描述

2、运输层:在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层(网络层)的IP地址查找目的端。

3、网络层:客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,我不作过多的描述,无非就是通过查找路由表决定通过那个路径到达服务器。

在这里插入图片描述
4. 链路层:客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

参考https://www.nowcoder.com/discuss/3853?pos=264&type=1&order=0

6、HTTP协议的请求报文与响应报文格式是什么,常用的HTTP状态码有哪些?
在这里插入图片描述

 2开头状态码
    2xx (成功)表示成功处理了请求的状态代码
200 (成功) 服务器已成功处理了请求。 通常。
3开头状态码
    3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
4开头状态码
    4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理
1:400 (错误请求) 服务器不理解请求的语法。
 
2:403 (禁止) 服务器拒绝请求。

3:404 (未找到) 服务器找不到请求的网页。
5开头状态码
   5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错
500 (服务器内部错误) 服务器遇到错误,无法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

重点:200,304,403404,500

7、SESSION和COOKIE的区别?GET和POST的区别

.cookie:
cookie是保存在浏览器端的键值对,可以用来做用户认证
.session:
将用户的会话信息保存在服务端,key值是随机产生的字符串,value值是session的内容
依赖于cookie将每个用户的随机字符串保存到用户浏览器上
Django中session默认保存在数据库中:django_session表
flask,session默认将加密的数据写在用户的cookie中

8、介绍一下ARP协议。ARP 欺骗

地址解析协议:主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源
地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗

在这里插入图片描述
9、255.255.255.255 、0.0.0.0、127.0.0.1

	255.255.255.255 该IP地址指的是受限的广播地址。受限广播地址与一般广播地址(直接广播地址)的区别在于,受限广播地址只能用于本地网络,路由器不会转发以受限广播地址为目的地址的分组
	0.0.0.0 常用于寻找自己的IP地址
	127.0.0.0  被用作回环地址,回环地址表示本机的地址,常用于对本机的测试

10 私有地址 10~ 172.16~ 192.168~
11. 子网掩码是标志两个IP地址是否同属于一个子网的
12 .交换机和路由器区别

   交换机
交换机工作于OSI参考模型的第二层,即数据链路层。交换机内部的CPU会在每个端口成功连接时,通过ARP协议学习它的MAC地址,保存成一张ARP表。在今后的通讯中,发往该MAC地址的数据包将仅送往其对应的端口,而不是所有的端口。因此,交换机可用于划分数据链路层广播,即冲突域;但它不能划分网络层广播,即广播域。
  路由器
路由器(Router)是一种计算机网络设备,提供了路由与转发两种重要机制,可以决定数据包从来源端到目的端所经过的路由路径(host到host之间的传输路径),这个过程称为路由;将路由器输入端的数据包移送至适当的路由器输出端(在路由器内部进行),这称为转送。路由工作在OSI模型的第三层——即网络层,例如IP协议。
路由器的一个作用是连通不同的网络,另一个作用是选择信息传送的线路。 路由器与交换器的差别,路由器是属于OSI第三层的产品,交换器是OSI第二层的产品(这里特指二层交换机)

13 什么是粘包现象

 TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
2 为什么出现粘包现象
  (1)发送方原因
  我们知道,TCP默认会使用Nagle算法。而Nagle算法主要做两件事:1)只有上一个分组得到确认,才会发送下一个分组;2)收集多个小分组,在一个确认到来时一起发送。
  所以,正是Nagle算法造成了发送方有可能造成粘包现象。
  (2)接收方原因
  TCP接收到分组时,并不会立刻送至应用层处理,或者说,应用层并不一定会立即处理;实际上,TCP将收到的分组保存至接收缓存里,然后应用程序主动从缓存里读收到的分组。这样 来,如果TCP接收分组的速度大于应用程序读分组的速度,多个包就会被存至缓存,应用程序读时,就会读到多个首尾相接粘到一起的包。

3 什么时候需要处理粘包现象
  (1)如果发送方发送的多个分组本来就是同一个数据的不同部分,比如一个很大的文件被分成多个分组发送,这时,当然不需要处理粘包的现象;
  (2)但如果多个分组本毫不相干,甚至是并列的关系,我们就一定要处理粘包问题了。
4 如何处理粘包现象
  (1)发送方
  对于发送方造成的粘包现象,我们可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭Nagle算法。
  (2)接收方
  遗憾的是TCP并没有处理接收方粘包现象的机制,我们只能在应用层进行处理。
  (3)应用层处理
  应用层的处理简单易行!并且不仅可以解决接收方造成的粘包问题,还能解决发送方造成的粘包问题。
  解方法就是循环处理:应用程序在处理从缓存读来的分组时,读完一条数据时,就应该循环读下一条数据,直到所有的数据都被处理;但是如何判断每条数据的长度呢?
  两种途径:
    1)格式化数据:每条数据有固定的格式(开始符、结束符),这种方法简单易行,但选择开始符和结束符的时候一定要注意每条数据的内部一定不能出现开始符或结束符;
    2)发送长度:发送每条数据的时候,将数据的长度一并发送,比如可以选择每条数据的前4字节是数据的长度(一个int来储存数据长度大小),应用层处理时可以根据长度来判断每条数据的开始和结束。

操作系统:
什么是系统的安全状态?

指系统能按某种顺序如(P1,P2,...,Pn),来为每个进程分配所需要的资源,直至最大需求,使每个进程都可以顺序完成。若系统不存在这样一个安全序列,则称系统处于不安全状态。

1、进程与线程的关系是什么,区别是什么?

进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。
线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
一个进程可以有多个线程,多个线程也可以并发执行

2、什么是死锁,死锁的产生条件是什么,如何避免死锁?

3、进程间的通信机制有哪些?他们的区别?

进程间通信主要包括【管道】, 【系统IPC(包括消息队列,信号量,共享存储),SOCKET】

管道主要分为:`普通管道PIPE 、流管道(s_pipe)、命名管道(name_pipe)`
管道包括三种:1)普通管道PIPE, 通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用. 2)流管道s_pipe: 去除了第一种限制,可以双向传输. 3)命名管道:name_pipe, 去除了第二种限制,可以在许多并不相关的进程之间进行通讯.
	
	信号量( semophore )是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。可以用来控制多个进程对共享资源的访问。防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
	消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
	信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
	共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
	套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

https://blog.csdn.net/EveryFriDay_ShuJk/article/details/79783334
进程间通信方式

4、线程间的通信机制。

锁机制
	互斥锁:提供了以排它方式阻止数据结构算法与数据结构知识库")被并发修改的方法。
	读写锁:允许多个线程同时读共享数据,而对写操作互斥。
	条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
信号量机制:包括无名线程信号量与有名线程信号量
信号机制:    类似于进程间的信号处理。
线程间通信的主要目的是用于线程同步,所以线程没有象进程通信中用于数据交换的通信机制。

进程间通信与线程间通信之间的关系?

: 因为WINDOWS运行的实体是线程, 狭义上的进程间通信其实是指分属于不同进程的线程之间的通讯.而单个进程之间的线程同步问题可归并为一种特殊的进程通信.它要用到内核支持的系统调用来保持线程之间同步. 通常用到的一些线程同步方法包括:Event, Mutex, 信号量Semaphore, 临界区资源等.

5、进程的常见状态是什么?各种状态之间的转换条件?
阻塞 就绪 运行
6、常见的linux命令。
top history netstat ps find rm 等

7.线程同步的方式?

互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。

参考线程同步方式

(四)什么是缓冲区溢出?有什么危害?其原因是什么?

缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

危害有以下两点:

程序崩溃,导致拒绝额服务
跳转并且执行一段恶意代码
造成缓冲区溢出的主要原因是程序中没有仔细检查用户输入。

如果你想深入了解缓冲区溢出,推荐阅读:缓冲区溢出攻击

(五)什么是死锁?死锁产生的条件?

在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是【两个或多个进程无限期的阻塞、相互等待的一种状态。】

死锁产生的四个条件(有一个条件不成立,则不会产生死锁)

互斥条件:一个资源一次只能被一个进程使用
请求与保持条件:一个进程因请求资源而阻塞时,对已获得资源保持不放
不剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
循环等待条件:若干进程之间形成一种头尾相接的环形等待资源关系

如果对死锁还不是太熟悉,建议阅读:死锁产生的原因和解锁的方法

死锁的处理基本策略和常用方法。

解决死锁的基本方法如下:

预防死锁、避免死锁、检测死锁、解除死锁

解决四多的常用策略如下:

鸵鸟策略、预防策略、避免策略、检测与解除死锁

如果你对死锁的处理策略不是太熟悉,推荐阅读:产生死锁的原因和必要条件+解决死锁的基本方法

(六)进程有哪几种状态?

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
阻塞状态: 进程等待某种条件,在条件满足之前无法执行

如果你对进程的几种状态以及中间的装换不太了解,建议阅读:进程的三种状态及转换

(七)分页和分段有什么区别?

段是信息的逻辑单位,它是根据用户的需要划分的,因此【段对用户是可见的】 ;页是信息的物理单位,是为了管理主存的方便而划分的,【对用户是透明的】。
段的大小不固定,有它所完成的功能决定;【页大大小固定,由系统决定】
段向用户提供【二维地址空间】;页向用户提供的是一维地址空间
段是信息的【逻辑单位,便于存储保护和信息的共享】,页的保护和共享受到限制。

如果你对分页和分段还不太了解,建议阅读:分段和分页

(八) 操作系统中进程调度策略有哪几种?

FCFS(先来先服务),优先级,时间片轮转,多级反馈

如果你想深入的了解这几种调度策略,推荐阅读:几个常用的操作系统进程调度算法

(九)说一说进程同步有哪几种机制。

原子操作、信号量机制、自旋锁管程、会合、分布式系统

如果你想深入的了解这几种机制,推荐阅读: 进程同步的几种机制

数据库:

1、SQL查询语句相关。

2、什么是视图?如何创建一个视图?视图有哪些优点?

3、如何创建一个索引,索引的底层实现是什么,索引的优缺点,为什么索引可以加快查询?

4、介绍一下数据库的事务,数据库的三范式。

网络安全

SQL注入

XSS

CSRF

SSRF

文件上传

命令执行

Ddos

对称和非对称加密

https

数据库
(一)什么是存储过程?有哪些优缺点?
存储过程是一些预编译的SQL语句。

更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。

存储过程是一个预编译的代码块,执行效率比较高
一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率
可以一定程度上确保数据安全

https://www.cnblogs.com/knowledgesea/archive/2013/01/02/2841588.html

(二)索引是什么?有什么作用以及优缺点?

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构

你也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引

索引加快数据库的检索速度
索引降低了插入、删除、修改等维护任务的速度
唯一索引可以确保每一行数据的唯一性
通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
索引需要占物理和数据空间

如果你对索引还不太熟悉,建议阅读:漫谈数据库索引

(三)什么是事务?

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

如果你对索引还不太熟悉,建议阅读:数据库事务 - Mr. David 专栏

(四)数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

如果你对两种锁还不太熟悉,建议阅读:深入理解乐观锁与悲观锁

(五) 使用索引查询一定能提高查询的性能吗?为什么

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改. 这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O. 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
基于非唯一性索引的检索
(六)简单说一说drop、delete与truncate的区别

SQL中的drop、delete、truncate都表示删除,但是三者有一些差别

delete和truncate只删除表的数据不删除表的结构
速度,一般来说: drop> truncate >delete
delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发. truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

如果你对这三者的用法还不太熟悉,建议阅读: drop、truncate和delete的区别

(七)drop、delete与truncate分别在什么场景之下使用?

不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate

(八) 超键、候选键、主键、外键分别是什么?

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)

外键:在一个表中存在的另一个表的主键称此表的外键。

(九)什么是视图?以及视图的使用场景有哪些?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

只暴露部分字段给访问者,所以就建一个虚表,就是视图
查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异
(十)说一说三个范式。

第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如 果存在"A → B → C"的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段 x → 非关键字段y

https://www.zhihu.com/question/24696366

安全
1.伪基站

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bulldozer Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值