ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c/c++岗位准备

2021-03-18 22:29:48  阅读:147  来源: 互联网

标签:触发器 连接 岗位 c++ TCP 内存 准备 new 报文


一.简介

1)公司介绍:

以视频为核心的智能物联网解决方案和大数据服务
是领先的安防产品及行业解决方案提供商,公司致力于不断提升视频处理技术和视频分析技术,面向全球提供领先的安防产品、专业的行业解决方案与优质的服务,为客户持续创造更大价值

2).岗位职责

1、根据项目需求、公司的相关规范,完成所负责模块的设计、开发工作;
2、分析并解决软件开发、测试、部署、使用过程中的问题;
3、参与撰写产品需求、总体设计、概要设计、详细设计等相关技术文档。

3).要求

1、本科及以上学历,计算机、电子信息等相关专业;
2、熟练掌握C++语言开发,注重用户体验;
3、熟悉Socket网络编程和TCP\IP等常用网络通信协议,熟悉多线程开发;
4、具有较强的质量意识和学习能力,有良好的沟通能力和团队协作精神。

二. 面经:

1) 自我介绍~架构师

1.你得是个程序员,需要能基本了解常用平台,语言,数据库等的特点,并能根据需求搭配出适用的开发配置方案,然后你得会写代码,必须知道怎么写代码才是性价比最高的。 从开发、部署、运行、维护态 知识储备 技术选型能力
优秀软件架构师同时也是出色的软件开发者
2.你得是行业顾问,至少得了解行业的特色,能找到需求问题的切入点,能够合理安排每个环节的联系结点。
3.你得具有技术说服力,横向沟通能力,能把你所构思的想法说给别人听,并能让别人理解并接受你的设计想法。
4.你得具有丰富的想象力,要有大局观 确认需求 一个架构师得需要足够的想象力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。
5.你得尽可能的了解最新资讯,更新最新技术理论,虽然不一定需要去学习或掌握,但需要知道新的技术能用在哪种情况中,资讯能给你带来更多业界动态。
架构师应该是一个程序玩家,至少我是这么认为的,把写目标程序代码看做是一种游戏,我经常是这么在做,在有空的时候会自己想点东西出来写写娱乐一下。
6.你得需要多做项目,项目的积累是非常重要,以设计模式来说,设计模式的名字是人定的,应用设计多了,自然而然的会将模式应用到系统中,在这过程中你并不会知道你所设计的应用到哪些模式,你只会知道要实现这个功能需要怎么做,当你有空的时候会不经意间发现原来这种做法还有个模式名。

  1. 对业务所面临的挑战的理解,从业务挑战到技术挑战映射的能力,或者说技术抽象的能力;
  2. 知识储备以及考虑的全面性,从开发、部署、运行、维护态;
  3. 技术选型能力,极厚的技术功底,开阔的技术视野;
  4. 在各种约束条件下权衡选择的能力,原则。
    需要长期的实战、经验积累
    • 架构应该是和商业对齐,甚至是业务生态圈对齐。
    • 其次,在商业中挖掘收益点。
    • 最后,将这些收益点设计一个可产品化的架构。
    优秀软件架构师同时也是出色的软件开发者,他们都是经过时间逐渐发展成为架构师的。你需要有退后一步看代码的能力,从而理解特定软件系统背后的设计决策。退后一步才能看到“大局

PPT 架构师。
不懂编程的架构师的职业生涯必定是短暂的,无论如何都不可本末倒置,要想实现自己的职业规划,不能荒废自己本身的技能,技术是架构师赖以生存的最基本能力。

2) 基础知识

①const

const修饰常量,定义指针,成员变量
指针和引用
1.指针是地址,引用是别名,
2.指针在运行时可以改变所指向的值,而引用一旦与某个对象绑定后就不再改变。意思是:指针可以被重新赋值以指向另一个对象,但是引用则总是在初始化时被指定的对象,以后不能改变,但是指向的内容可以改变
3.程序为指针变量分配区域,而不为引用分配内存区域。因为引用生命时必须初始化,从而指向一个已经存在的对象,引用不能为空值。
list和vector的底层实现
1.vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。
因此,它能够高效地进行随机存取,时间复杂度是O(1)。
但是,在进行插入和删除操作时,会造成内存块的拷贝,因此时间复杂度为O(n)
2.list是由双向链表实现的,因此内存空间是不连续的。
其只能通过指针访问数据,所以list的随机存取效率很低,时间复杂度为O(n)。
不过由于链表自身的特点,能够进行高效的插入和删除。

父子类构造顺序,析构顺序
构造子类时,先执行父类的构造函数,然后执行子类的构造函数
析构子类时,先执行子类的析构函数,然后执行父类的析构函数。

② 多态

用父类的引用指向子类的对象。多态可以理解成“一个接口,多种实现”,就是同一种事物表现出的多种形态,多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。
多态存在的三个必要条件
1,要有继承
2,要有重写
3,父类引用指向子类对象
不能
1、static方法,因为被static修饰的方法是属于类的,而不是属于实例的
2、final方法,因为被final修饰的方法无法被子类重写
3、private方法和protected方法,前

封装
也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
指可以让某个类型的对象获得另一个类型的对象的属性的方法

问到虚函数表中的指针存放在哪里,应该是全局静量区

手写工厂模式
手写希尔排序

C/C++ 等都是编译型语言
计算机网络有几层(传输层有哪些协议)
TCP/UDP区别
TCP三次握手协议过程

③ 数组和链表区别

数组

1在内存中,数组是一块连续的区域,且存储着相同类型的数据。
由于这两个特点,数组具有随机访问的特性。
2插入和删除的效率低。插入数据时,这个位置后面的数据在内存中都要向后移;删除数据时,这个位置后面的数据都要向前移。
3随机读取数据的效率高。因为数组的地址是连续的。扩展性低,数组预先定义的空间不够时需要重新定义数组

链表:
1在内存中可以是不连续的。每个数据保存着下一个数据的内存地址。
2插入和删除的效率高。插入的数据可以在任意一个位置,只需要获取下一个数据的位置以及将自己的位置告诉上一个数据。
3不具有随机访问性,查找数据的效率低。访问某个位置的数据都需要从第一个数据开始查找。扩展性强,不需要预先定义大小。

④ 重写和重载的概念

重载(overload):是函数名相同,参数列表不同,override只是在类的内部存在。

重写(override),也叫覆盖。子类重新定义父类中有相同名称和参数的虚函数(virtual)。在继承关系之间。C++利用虚函数实现多态。

重写的特点:

      1 被重写的函数不能是static的。必须是virtual的

      2 重写函数必须有相同的类型,名称和参数列表

      3 重写函数的访问修饰符可以不同。尽管父类的virtual方法是private的,派生类中重写改写为public,protected也是可以的。

C++多态的机制
虚函数重写:子类重新定义父类中有相同返回值、名称和参数的虚函数;
非虚函重写:子类重新定义父类中有相同名称和参数的非虚函数;

⑤给一个集合,集合中有0-9共10个数,有多少个子集

含有A中0,1,2,3,4,5,6,7,8,9,10个元素的集合都是A的子集,共有:
C10 0 +C 10 1 +…+C10 10=2^10-1

链表中在某个位置中插入一个节点,如何插入
线程和多线程的区别
代码中常用的数据结构有哪些
报文中前几个字节包含什么

⑥C++的class和C的struct有啥区别?

A:从访问权限,友元、继承等C++高级特性展开描述,同时,C++的struct和class仅有访问权限(封装)的区别,但是C所支持的struct就没有那么多功能了……回答的比较全面,貌似面试官还算满意。

⑦C++是怎么动态分配内存的?

A:说了一下new关键字

Q:new和malloc有啥区别?
  A:这道题以前见到过,大概说了4~5条,结果有一点说到new可以被重载,malloc不允许被重载的时候,被面试官打断了,反问了一句,new不是关键字吗?关键字为什么可以被重载?当时有点紧张,稀里糊涂的说了一句new可以被重载。但后来想想,比较全面的回答应该是new既是关键字,也可以作为运算符,作为运算符时,可以作为 operator new函数重载。只是当时没反应过来,应该被减分了。

  1. malloc/free是标准库函数,new/delete是C++运算符
  2. malloc失败返回空,new失败抛异常
  3. new/delete会调用构造、析构函数,malloc/free不会,所以他们无法满足动态对象的要求。
  4. new返回有类型的指针,malloc返回无类型的指针
  5.   属性
    

new/delete是C++关键字,需要编译器支持。
malloc/free是库函数,需要头文件支持。

  1. 参数
    new申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。
    malloc则需要程序员显式地指出所需内存的尺寸。

  2. 返回类型
    new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。
    而malloc内存分配成功则是返回void * , 需要通过强制类型转换将void* 指针转换成我们需要的类型。

3.分配失败

new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。

4.自定义类型
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。
delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。

malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。

5.重载

C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。

  1. 内存区域

new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。

释放你在构造时申请的资源
  Q:如何申请一块超大连续内存?
  A: 这道题没有见过,但是根据对new和malloc的了解,new申请较大内存的时候,貌似是物理不连续的(虚拟地址连续),malloc申请内存是连续内存,但是会受到内核的限制,从这个方面,简单的回答了一下。后来查了一下,感觉面试官可能是想考察我对Linux内核管理内存方式的掌握。

Q:说一下虚函数机制?
  A:这个问题就比较常规,就从虚函数表的实现,单继承,多继承,派生类虚函数重写等方面开始说。貌似还算可以。

Q:说一下vector和List的区别?
  A:说了一下vector和List的访问元素的特性,并简单的说了一下vector和list的底层实现,大部分是《C++ STL》上的内容。好在没问我内存管理那一块,不怎么会,心虚……

Q:你都知道哪些设计模式?
  A:简单说了一下常见的几种模式,单例、工厂、建造者等等。然后他让我手写单例,我写了一个比较简单的用静态成员实现的线程安全单例,貌似还算满意。

Q:你调过最大的bug是什么?为什么?
  A:这个问题其实挺深奥的,我研究生复试面试就遇到过,一方面,可以反映你解决问题的思考方式,一方面也可以看你工作的层次。我挑了一个我觉得还可以的场景。结果说完之后被面试官点评,我觉得你debug的方式有点问题……blahblahblah说了一堆,我也没太搞懂他的想法,礼貌性的回应了一句“我觉得你说的很对”。

3) 计网知识:

ip多少位 32位
mac多少位 48位
ipv6多少位 128位
三次握手
交换机和路由器区别
ip位于哪层 网络层

①三次握手:

TCP的三次握手最主要是防止已过期的连接再次传到被连接的主机。
如果采用两次的话,会出现下面这种情况。
比如是A机要连到B机,结果发送的连接信息由于某种原因没有到达B机;
于是,A机又发了一次,结果这次B收到了,于是就发信息回来,两机就连接。
传完东西后,断开。
结果这时候,原先没有到达(超时到达)的连接信息突然又传到了B机,(第一个到达晚了 B连接上了 B等着A传东西 但A不传
)于是B机发信息给A,然后B机就以为和A连上了,这个时候B机就在等待A传东西过去。

  1. 三次握手改成仅需要两次握手,死锁是可能发生
    考虑计算机A和B之间的通信,假定B给A发送一个连接请求分组,A收到了这个分组,并发送了确认应答分组。按照两次握手的协定,A认为连接已经成功地建立了,可以开始发送数据分组。可是,B在A的应答分组在传输中被丢失的情况下,(A等着B的确认应答 死锁)将不知道A是否已准备好,不知道A建议什么样的序列号,B甚至怀疑A是否收到自己的连接请求分组。在这种情况下,B认为连接还未建立成功,将忽略A发来的任何数据分组,只等待连接确认应答分组。而A在发出的分组超时后,重复发送同样的分组。这样就形成了死锁

②七层协议

物理层

TCP/IP模型的网络接口层可近似看为物理层+链路层
网际层可近似看作网络层
传输层可近似看作运输层
但是TCP/IP模型和OSI模型的一个很大的区别就是:
OSI模型中,网络层可以选择面向连接和无连接,而运输层中必定是面向连接的
TCP/IP模型中,网络层不面向连接,而传输层中是可以选择面向连接的TCP,和无连接的UDP
此外,他们之间还有些差别.
• OSI参考模型精确地定义了三个主要概念:服务、协议、接口;而TCP/IP模型并没有,这不符合软件工程的思想。
层次 简介
物理层 传输单位:比特
硬件:集线器、中继器
任务:透明地传输比特流
功能:定义了电路接口的一些参数(如机械尺寸、形状,交换电路的数量和排列等)
也规定了通信链路上传输的信号的意义和电气特性(即什么信号代表0,什么信号代表1)
注意:传输信息所用的物理媒介,比如双绞线、光纤等不属于物理层协议,而在物理层协议之下
数据链路层 传输单位:帧
硬件:交换机,网桥
任务:将网络层传下来的IP数据报封装成帧
功能:成帧、差错控制、流量控制、传输管理
作用:实现数据在链路上的点对点的正确传输

网络层 传输单位:数据报
硬件:路由器
任务:将传输层传下来的报文段封装分组,选择合适的路由使分组能够正确交付到目的主机
功能:流量控制,拥塞控制,差错控制,网际互联,路由选择
作用:就是实现信息在各个网络之间的正确传输
运输层 传输单位:报文段(TCP),用户数据报(UDP)

任务:负责两个进程间的通信
功能:流量控制,差错控制,服务质量,数据传输管理
作用:实现端到端之间的通信,链路层是点到点
注:运输层还具有复用和分用的功能
会话层 向表示层实体或用户进程提供建立连接并在连接上有序地传输数据,也成为建立同步(SYN)

会话层负责管理主机间的会话进程,包括建立、管理以及终止进程间的会话
表示层 转变数据格式,包括加密、解密、压缩等功能

应用层 为特定类型的网络应用提供访问OSI的手段

③子网掩码

子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分

用ip地址和子网掩码的二进制数进行“与”运算即可得出网络号
A类的默认子网掩码 255.0.0.0 一个子网最多可以容纳1677万多台电脑
B类的默认子网掩码 255.255.0.0 一个子网最多可以容纳6万台电脑
C类的默认子网掩码 255.255.255.0 一个子网最多可以容纳254台电脑

④URL 请求

https://blog.csdn.net/mingchengtx/article/details/106000231
1.DNS域名解析
2.建立TCP连接
3.浏览器通过http协议发送请求
2.1 应用层:发送HTTP请求
2.2 传输层:TCP传输报文
2.3 网络层:IP协议查询Mac地址
2.4 链路层:以太网协议
4 某些服务会做重定向相应
4 服务器发出一个HTML响应
5 释放TCP连接
6 浏览器显示页面
7 获取其他内容

1.DNS域名解析
在浏览器DNS缓存中搜索
在操作系统DNS缓存中搜索
读取系统hosts文件,查找其中是否有对应的ip
向本地配置的首选DNS服务器发起域名解析请求

2.建立TCP连接

 主机浏览器通过DNS解析得到了目标服务器的IP地址后,与服务器建立TCP连接。
   

 TCP3次握手连接:浏览器所在的客户机向服务器发出连接请求报文(SYN标志为1);服务器接收报文后,同意建立连接,向客户机发出确认报文(SYN,ACK标志位均为1);客户机接收到确认报文后,再次向服务器发出报文,确认已接收到确认报文;此处客户机与服务器之间的TCP连接建立完成,开始通信。
    1

3.浏览器通过http协议发送请求
在这里插入图片描述
2.1 应用层:发送HTTP请求
浏览器构造一个HTTP报文,包括:

请求报头(Request Header):请求方法、目标地址、遵循的协议等等。
请求主体

2.2 传输层:TCP传输报文
传输层会发起一条到达服务器的TCP连接,会对数据进行分割(已以报文段为单位),标记编号,方便服务器接收时准确地还原报文信息。
在建立连接前,会先进行TCp三次握手
2.3 网络层:IP协议查询Mac地址
将数据段打包加入源地址和目标的ip地址,寻找传输路线。
判断目标地址是否与当前地址处于同一个网络中,如果是直接根据Mac地址发送,否则使用路由表查找下一跳的地址,以及使用ARP协议查询它的Mac地址。

ps: 跳(hop):网络中的一个区间。一跳:是主机或路由器网卡不经其他路由器而能直接到达的相邻主机或路由器网卡之间的一个区间。
ARP协议:Address Resolution Protocol,一种解决地址问题的协议。以目标ip地址为线索,定位下一个应该接受数据分包的网络设备对应的MAC地址。

2.4 链路层:以太网协议

根据以太网协议将数据分为以“帧”为单位的数据包,每一帧分两部分:

标头:数据包的发送者、接受者、数据类型
数据:数据包具体内容

4 某些服务会做重定向相应
对大型网站存在多个主机站点,为了负载均衡,会重定向,返回的状态码以3开头的重定向码,浏览器获得重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新访问。
重定向的作用:为了负载均衡或导入流量,提高SEO排名。可以提高站点的业务并发处理能力,也可将多个域名的访问,集中到一个站点。
4 服务器发出一个HTML响应
返回状态码200 ok,表示服务器可以相应请求,返回报文,由于在报头中Content-type为“text/html”,浏览器以html形式呈现。
5 释放TCP连接

浏览器向服务器发出连接释放报文,然后停止发送数据;
服务器接收到释放报文后发出确认报文,然后将服务器上为传送完的数据发送完。
服务器传输完毕后,向客户机发送连接释放报文;
客户端收到报文后,发出确认,然后等待一段时间后,释放TCP连接

6 浏览器显示页面
浏览器接收到返回的数据包,根据浏览器的渲染机制对相应的数据进项渲染。
7 获取其他内容
浏览器发送获取嵌入在html中的其他内容,比如图片url,js文件等,浏览器会通过这些url重新发送请求,请求过程依然是html读取类似的过程,查询域名,发送请求,重定向等。这些静态文件可缓存到浏览器中。
RIP和OSPF
RIP:全称(路由信息协议) 基于 距离向量 的路由选择协议

OSPF:全称(开放最短路径优先) 基于 链路状态 的路由选择协议
2.工作核心不同
RIP: 数跳数
OSPF: 链路状态的度量值

3.【向谁发】
RIP: 仅向相邻的路由器发送消息
OSPF: 向自治系统中的所有路由器发送消息,路由器的链路状态协议只是单向传递,不存在“坏消息(某个网络不可达)传播的慢”的缺点,更新的收敛性可以得到保证。

4.【发什么】
RIP: 发送整个路由表
OSPF: 发送相邻路由器的状态信息

5.【什么时候发】
RIP: 固定时间间隔 交换路由信息 ;网络拓扑结构发生变化时,也会想所有的路由器发送信息。
好消息传的快,坏消息传的慢。
OSPF: 链路状态(不一定是结构)发生变化时,采用洪泛法向所有的路由器发送信息。

⑤绝对相对

绝对地址:互联网上的独立地址,在任何网站通过这个地址可以直接到达目标网页。包含主域名和目录地址。
相对地址:相对于网站的地址,当域名改变时,相对地址的“绝对地址”也发生变化。

4) 设计模式

转 https://blog.csdn.net/weixin_43122090/article/details/105462226
创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。
结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。
行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。

①单例模式

单例模式的八种方式:饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查、静态内部类、枚举

②工厂模式

③ OOP设计模式五大原则

1、单一职责原则
单一职责有2个含义,一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责。减少类的耦合,提高类的复用性。
2、接口隔离原则
表明客户端不应该被强迫实现一些他们不会使用的接口,应该把胖接口中额方法分组,然后用多个接口代替它,每个接口服务于一个子模块。简单说,就是使用多个专门的接口比使用单个接口好很多。
该原则观点如下:
1)一个类对另外一个类的依赖性应当是建立在最小的接口上
2)客户端程序不应该依赖它不需要的接口方法。
3、开放-封闭原则
open模块的行为必须是开放的、支持扩展的,而不是僵化的。
closed在对模块的功能进行扩展时,不应该影响或大规模影响已有的程序模块。一句话概括:一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。
核心思想就是对抽象编程,而不对具体编程。
4、替换原则
子类型必须能够替换掉他们的父类型、并出现在父类能够出现的任何地方。
主要针对继承的设计原则
1)父类的方法都要在子类中实现或者重写,并且派生类只实现其抽象类中生命的方法,而不应当给出多余的,方法定义或实现。
2)在客户端程序中只应该使用父类对象而不应当直接使用子类对象,这样可以实现运行期间绑定。
5、依赖倒置原则

5)手撕

①判断是否为循环链表

https://www.cnblogs.com/xshang/p/3592571.html
设置快慢指针 如果最终慢指针追上快指针,指向同一个位置 说明是循环链表
如果指向了NULL 说明不是循环链表
找链表的中间节点
思路:
有两个指针同时从开头(首元结点)遍历
一个快指针一次走两步,一个慢指针一次走一步
快指针先到链表尾部,满指针恰好到达链表中部(当链表长度为奇数时,满指针指向的是链表中间结点;当链表长度为偶数时,满指针指向的结点和满指针指向结点的下一个结点都是链表的中间结点)

6)数据库

①SQL优化

1.在表中建立索引,优先考虑where.group by使用到的字段。

2.查询条件中,一定不要使用select ,因为会返回过多无用的字段会降低查询效率。应该使用具体的字段代替,只返回使用到的字段。

3.不要在where条件中使用左右两边都是%的like模糊查询,如:

SELECT * FROM t_order WHERE customer LIKE '%zhang%'

这样会导致数据库引擎放弃索引进行全表扫描。

优化:尽量在字段后面使用模糊查询。如下:

SELECT * FROM t_order WHERE customer LIKE 'zhang%'

4.尽量不要使用in 和not in,会造成全表扫描。如下:

SELECT * FROM t_order WHERE id IN (2,3)

SELECT * FROM t_order1 WHERE customer IN (SELECT customer FROM t_order2)

将表达式.函数操作移动到等号右侧。如下:

SELECT * FROM t_order2 WHERE score = 10*10

SELECT * FROM t_order2 WHERE customer LIKE 'zhang%'

9.尽量不要使用where 1=1的条件

有时候,在开发过程中,为了方便拼装查询条件,我们会加上该条件,这样,会造成进行全表扫描。如下:

SELECT * FROM t_order WHERE 1=1

优化:

如果用代码拼装sql,则由代码进行判断,没where加where,有where加and

如果用mybatis,请用mybatis的where语法。

10.程序要尽量避免大事务操作,提高系统并发能力。

11.一个表的索引数最好不要超过6个,如果索引太多的话,就需要考虑一下那些不常使用到的列上建的索引是否有必要。

② trigger 触发器:

它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等
DML触发器
当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。
DDL触发器
它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。
登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

③ 存储过程:

是一组为了完成特定功能的SQL语句集,利用SQL Server所提供的T-SQL语言所编写的程序,经编译后存储在数据库中。
调用存储过程时,必须使用CALL或EXECUTE语句

触发器与存储过程的区别:
触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。

④索引

索引是加快数据库的查询速度的一种手段
创建索引使用: alter table 表名 add index 索引名[可选] (字段名, xxx);
删除索引使用: alter table 表名 drop index 索引名;

存储过程:是一组为了完成特定功能的SQL语句集,利用SQL Server所提供的T-SQL语言所编写的程序,经编译后存储在数据库中。
调用存储过程时,必须使用CALL或EXECUTE语句
吧。

标签:触发器,连接,岗位,c++,TCP,内存,准备,new,报文
来源: https://blog.csdn.net/Cup3380544530/article/details/114992071

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有