目录
1.网络
(1)七层协议
(2)TCP/UDP
(3)HTTP协议
HTTP请求:
HTTP响应
HTTP状态码
Cookie和Session:
(4)ARP协议
(5)TCP/IP协议
(6)三次握手,建立链接 第二次握手丢掉会怎样?
(7)单播和广播
(8)www.baidu.com的一级域名和二级域名是什么?
(9)如何设置iss网络安全设施
(10)域名ping不同怎么排查网络故障
(11)打开一个网页的流程
(11)输入一个URL,但是没有访问到预期的网站,是什么原因?
(12)访问网页,发生故障,你怎么解决
2.LInux
(1)Linux查看系统内存剩余情况的命令
(2)linux基础命令
(3)如何设置linux log系统,描述设计思路和模块功能?
(4)linux查看线程,进程的命令
(5)Linux信号有哪些:
(6)Linux的分布
(7)如何编译Linux内核
(8)如何安装Linux操作系统?如何安装windows操作系统?如何安装linux,windows双系统?
(9)Linux的启动顺序
3.操作系统
(1)进程之间的通信方式 阻塞和非阻塞分别是? 是否占用CPU?
(2)固态硬盘和机械硬盘
(3)守护进程如何实现?
(4)在开发中遇到了内存错误的问题,如何发现问题并解决问题?
4.Java
(1)内存分为哪几个部分?局部变量static在哪部分
(2)未初始化会不会自动赋值,赋值为多少?
(3)java单例
(4)new申请内存的方法及动态内存有关知识
(5)对函数多态有何了解?重载和覆盖
(6)指针用完后如果不指空,会产生怎样的结果?
(7)在堆上分配内存的函数?栈上有哪些变量?全局变量在内存的什么位置?
5.SQL
(1)SQL select的使用
(2)数据库索引?索引的优缺点?
(3)sql调优
(4)怎么优化数据库?
6.测试方案
(1)测试两个网页打开速度差别
(2)如果产品出现概率很低的问题,无法重现,但是品质要求必须解决怎么处理?
(3)如何测量网速
(4)微信和QQ有什么优缺点?
(5)用什么工具测试web页面打开的速度?
(6)seleniu相关
7.算法
(1)怎么判断链表又环?如何删除单链表的中间节点?
1.1删除链表的一个元素
1.2 输出链表的倒数第k个元素
1.3 找到链表的中间元素 ——若链表元素个数为奇数,则输出中间爱元素,若为偶数,则输出中间两个任意一个定义两个指针,一个一次走一步,一个一次走两步,当走两步的到达链表尾部,走一步的到达链表中间
1.4 判断链表是否有环
(2)一篇英语文章,在内存足够下如何统计出现次数最多的单词?内存不够的情况下?
(3)100G的文件统计指定单词出现的次数?
(4)冒泡排序
(5)字节对齐
8.扩展
TCP : 面向连接,提供可靠服务,面向字节流,拥塞机制,流控,只能点对点,首部只有20字节,提供全双工可靠信道
UDP: 无连接,尽最大努力交付,面向报文,可一对-,一对多,多对多交互通信,首部8字节,不可靠信道
HTTP协议:无连接无状态的协议,无状态是指Web浏览器与Web服务器之间不需要建立持久的连接。
POST /test.php HTTP/1.1 //请求行 请求方法 目录 版本
HOST:www.test.com //请求头 主机地址
User-Agent:Mozilla/5.0 (windows NT 6.1;rv:15.0)//空白行,代表请求头结束 浏览器标识
Username=admin&password=admin //请求正文
GET、POST、HEAD、PUT请求方法的区别:
GET:GET方法用于获取请求页面的指定信息。参数直接拼接在地址栏URL的后面;有具体的长度限制(<1024K);数据明文显示,不安全;产生一个数据包;浏览器会把http header 和 data 一并发出去,服务器响应200(返回数据)
POST:最大的区别在于,GET方法没有请求内容,而POST是有请求内容的。参数是放到请求体里面;理论上无长度限制;产生两个数据包;浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok
HEAD:这个请求的功能与GET请求相似,不同之处在于服务器不会再其响应中返回消息主体,因此,这种方法可用于检查某一资源在向其提交GET请求前是否存在。
PUT:PUT方法用于请求服务器把请求中的实体存储在请求资源下,如果请求资源已经在服务器中存在,那么将会用此请求中的数据替换原先的数据。向服务器上传指定的资源。
HTTP/1.1 200 OK //响应行 版本 状态码 状态码描述
Date: Sun, 15 Nov 2015 11:02:04 GMT //响应头
Server: bfe/1.0.8.9
Content-Length: 2605 //内容长度
Content-Type: application/javascript //文档类型
Cache-Control: max-age=315360000
Expires: Fri, 13 Jun 2025 09:54:00 GMT
Content-Encoding: gzip //编码方法
Set-Cookie: H_PS_PSSID=2022_1438_1944_1788; path=/; domain=test.com
Connection: keep-alive
//空白行,代表响应头结束
Index.html //响应正文
五种状态码:
1xx:信息提示,表示请求已被成功接收,继续处理。
2xx:请求被成功提交。
3xx:客户端被重定向到其他资源。
4xx:客户端错误状态码,格式错误或者不存在资源。
5xx:描述服务器内部错误。
常见的状态码描述如下:
200:客户端请求成功,是最常见的状态。
302:重定向。
404:请求资源不存在,是最常见的状态。
400:客户端请求有语法错误,不能被服务器所理解。
401:请求未经授权。
403:服务器收到请求,但是拒绝提供服务。
500:服务器内部错误,是最常见的状态。服务器发生不可预期的错误。
503:服务器当前不能处理客户端的请求。
session和cookies同样都是针对单独用户的变量(或者说是对象好像更合适点),不同的用户在访问网站的时候 都会拥有各自的session或者cookies,不同用户之间互不干扰。
不同点 session cookies
存储位置不同 服务器端产生,较安全,但session较多则会影响性能 客户端产,安全性稍弱,生命周期不同
生命周期 在指定的时间后会结束,不到指定的时间, 默认浏览器进程结束而结束,但手动指定时间,则
也会随着浏览器进程的结束而结束。 不受浏览器进程结束的影响。
数据位置 放在服务器上 数据存放在客户的浏览器
安全性 安全 不安全
session会在一定时间内保存在服务器上, 减轻服务器性能方面,应当使用COOKIE,
当访问增多,会比较占用你服务器的性能 一个站点在客户端存放的COOKIE不能3K
ARP:IP地址转换为MAC地址
ARP原理之广播请求单播回应:
TCP
三次握手
第一次握手后,S可以确认自己收报文与C发报文的功能都正常,而C呢,它什么都不能确认。
第二次握手后,C可以确认自己的收发报文与S的收发报文功能都正常,也就是认为连接已建立。
那么第三次呢,S也可以确认双方能够正常通信。
.com为顶级域 ,.baidu.com为二级域,www.baidu.com为三级域名
ping 命令 作用:用于测试另一台主机是否可达,常用于排查网络故障。
用法: ping 域名或ip地址
常见的网络故障主要有 硬件故障 和 软件故障
硬件故障主要有:
① 网卡物理损坏 (由于使用中发送电子元件损坏而造成网卡无法使用)
② 链路故障 (常表现为网线或水晶头在制作过程中出现线路问题, 或 线路老化造成的故障)
软件故障主要有 :
① 网卡驱动故障 (即网卡驱动不兼容)
排查过程:
1 ping 127.0.0.1 排查本机 TCP/IP 协议是否正常
2 ping 本机IP 排查网卡或网卡驱动是否正常
3 ping 同网段IP 排查交换机端口工作模式、vlan划分
4 ping 通网段网关 排查主机到本地网络是否正常
5 ping 公网IP 排查路由是否正常
6 ping 公网某个域名 排查DNS服务配置是否正常
1. DNS解析 :
1) 浏览器首先搜索浏览器自身缓存的DNS记录。
2) 如果浏览器缓存中没有找到需要的记录或记录已经过期,则搜索hosts文件和操作系统缓存。
3) 如果在hosts文件和操作系统缓存中没有找到需要的记录或记录已经过期,则向域名解析服务器发送解析请求。
4) 如果域名解析服务器也没有该域名的记录,则开始递归+迭代解析。
5) 获取域名对应的IP后,一步步向上返回,直到返回给浏览器。
浏览器就得到了url的IP地址。
2.发起TCP请求,三次握手
三次握手的过程:
至此,浏览器与服务器已经建立了TCP连接,开始进行通信。
3. 建立TCP连接后,浏览器向服务器发送http请求 例如:浏览器发出取文件指令GET
4 负载均衡
什么是负载均衡?当一台服务器无法支持大量的用户访问时,将用户分摊到两个或多个服务器上的方法叫负载均衡。
1) 一般,如果我们的平台配备了负载均衡的话,前一步DNS解析获得的IP地址应该是我们Nginx负载均衡服务器的IP地址。所以,我们的浏览器将我们的网页请求发送到了Nginx负载均衡服务器上。
2) Nginx根据我们设定的分配算法和规则,选择一台后端的真实Web服务器,与之建立TCP连接、并转发我们浏览器发出去的网页请求。
3) Web服务器收到请求,产生响应,并将网页发送给Nginx负载均衡服务器。
4) Nginx负载均衡服务器将网页传递给filters链处理,之后发回给我们的浏览器。
5 服务器响应http请求,将请求的指定资源发送给浏览器
6.浏览器释放TCP连接
四次挥手过程:
1.浏览器向服务器发送释放连接报文;
2.服务器收到释放报文后,发出确认报文,然后将服务器上未传送完的数据发送完;
3.服务器数据传输完成后,向浏览器发送释放连接请求;
4.浏览器收到报文后,发出确认,然后等待一段时间后,释放TCP连接。
2.1.7 浏览器渲染
1) 浏览器根据页面内容,生成DOM Tree。根据CSS内容,生成CSS Rule Tree(规则树)。调用JS执行引擎执行JS代码。
2) 根据DOM Tree和CSS Rule Tree生成Render Tree(呈现树)
3) 根据Render Tree渲染网页
1.DNS坏掉了,修改自己的IP地址为8.8.8.8试试
2.网络断了
3.服务器拒绝访问
4.请求或者响应在网络传输中途被劫走了
如果电脑在打开百度等网页的时候失败,如何排查问题出现在哪里?
答:从七层网络的角度进行逐层分析,物理层-即网线有没有连接;数据链路层-即网口的灯有没有亮;某层-可以查询本机的IP地址,根据IP地址和子网掩码的计算结果查看是否和网关在同一子网,还应检查DHCP动态分配的IP地址,看是否和网关在同一个子网;检查本地ARP表中网关的IP地址和MAC地址是否对应
知识点:
OSI七层模型解决网络故障实战思路
物理层故障原因:①设别电源未打开 ②设别电源未接通 ③网络电缆松脱 ④电缆故障 ⑤电缆类型不正确
数据链路层故障原因:①设别驱动程序出错 ②设备没有安装驱动程序 ③设备配置错误
网络层故障原因:①IP地址是否设置正确 ②子网掩码是否正确 ③网关是否正确 ④DNS或DHCP是否正确
网络层常用的排除故障的命令包括:ipconfig命令、ping命令、tracert命令
传输层故障原因:①防火墙设置错误 ②应用程序的TCP的端口是否被打开
会话层、表示层、应用层故障原因:这三层主要涉及使用软件的故障原因,把应用软件设置正确,问题迎刃而解。
(13)HTTP和HTTPS有什么不同
(14)
1)free 2)cat /proc/meminfo
pwd | 显示当前路径 |
cd | 切换目录 |
mkdir | 创建目录 mkdir 目录名 -p 递归创建目录 |
rm -rf 目录名 | 删除空目录 |
mv | 移动 |
cp | 复制 |
vi | 文本编辑器 |
:q! | 不保存退出 |
:wq | 保存 |
cp | 复制 |
find [路径] [选项] | 查找文件 |
ls | 查看目录或文件信息 |
grep | 过滤 在指定文件中查找字符(串)并打印该行 grep 字符串 文件名 |
cat | 显示文本文件内容 |
ps -ef | 显示所有运行进程,并显示启动进程的命令 |
netstat -anp | 查看所有端口 |
netstat -apn|grep 8080 | 通过命令查找到占用此端口的进程编号 |
ps -ef | grep tomcat | 通过命令查找tomcat进程 |
service iptables start | 开启防火墙 |
service iptables stop | 关闭防火墙 |
route add default gw 10.121.34.41 eth0 Route add -net 10.121.34.47 netmask 255.255.255.0 gw 10.121.34.41 |
添加路由命令 |
route del -host 0.121.34.41 dev eth0 | 删除一条路由 |
grep [option] pattern [file] 注:中间包含空格的词需要加单引号; -n --number 列出所找词所在行 |
文件中查找某个词命令 |
find [OPTION] [path...] [expression] 注:find 命令后面要紧跟查找范围,大到根目录,小到当前目录,都可以(可是相对或绝对路径)。find 会深入到这个路径的每一个子目录中去寻找。 |
我的东西在哪(迅速在指定的范围内查找到文件) |
locate file | 更快速的定位文件(适合当用户完全不记得自己的文件放哪时) |
free(空闲内存=free+buffers+cached=total-used)
|
查看内存 |
top(动态显示CPU占用情况,能够实时显示系统 中各个进程的资源占用状况) | 查看各应用内存占用情况 |
查看进程:
1、ps 命令用于查看当前正在运行的进程。
grep 是搜索 例如: ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息
2、ps -aux | grep java
-aux 显示所有状态 ps
3. kill 命令用于终止进程
例如: kill -9 [PID] -9 表示强迫进程立即停止 通常用 ps 查看进程 PID ,用 kill 命令终止进程
Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:
内核的引导。
运行 init。
系统初始化。
建立终端 。
用户登录系统 具体内容见:https://www.runoob.com/linux/linux-system-boot.html
(10)Linux服务器下HTTP,HTTPS抓包分析
六大通信方式:
管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。(有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。)
消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。( 对临界资源进行保护)
socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
文件锁:
后台任务(守护进程):是一类在后台运行的特殊进程,它不受任何终端控制,它的特点如下:
(1)继承当前 session 的标准输出(stdout)和标准错误(stderr),因此守护进程任务依然会将所有输出同步输出到控制台
(2)不继承当前 session 的标准输入(stdin),因此关闭信号将无法发送到守护进程中。
守护进程的编写以及步骤:
1.fork子进程,而后父进程退出,此时子进程会被init进程接管。
2.修改子进程的工作目录、创建新进程组和新会话、修改umask。
3.子进程再次fork一个进程,这个进程可以称为孙子进程,而后子进程退出。
4.重定向孙子进程的标准输入流、标准输出流、标准错误流到/dev/null。
#include
#include
#include
#include
#define MAXFD 64
void daemon_init(const char* pname, int facility)
{
int i;
pit_t pid;
/*fork()一个子进程,并终止父进程*/
if(pid=fork())
{
exit(0);
}
/*setsid()调用创建了一个新的进程组,调用进程成为该进程组的首进程。
这样,就使该进程脱离原来的终端,成为了独立终端外的进程*/
setsid();
/*忽略SIGHUP信号,重新fork。
这样使进程不再是进程组的首进程,可以防止在某些情况下进程意外的打开终端而重新与终端发生联系。*/
signal(SIGHUP,SIG_IGN);
if(pid=fork()) //fork()终止第一子进程
exit(0);
/*第二子进程*/
daemon_proc = 1;
/*改变工作目录,清楚文件掩码。
改变工作目录主要是为了切断进程与原有文件系统的联系。
并且保证无论从什么地方启动进程都能正常工作。清除文件掩码是为了消除进程自身掩码对其创建文件的影响。*/
chdir("/"); //将工作目录设定位“/”
umask(0);
/* 关闭全部已打开的文件句柄。
这是为了防止子进程继承在父进程中打开的文件而使这些文件始终保持打开从而产生某些冲突。*/
for(i = 0; i
引起内存溢出的原因有很多种,常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小;
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
重点排查以下几点:
1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
2.检查代码中是否有死循环或递归调用。
3.检查是否有大循环重复产生新对象实体。
4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中 数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。
第四步,使用内存查看工具动态查看内存使用情况
详细可见https://blog.csdn.net/haozhugogo/article/details/77604586
JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器。
堆:是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,。从JDK1.7版本之后,运行时常量池从方法区移到了堆上。
方法区:用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区JDK1.7及以前被称为永久代,从JDK1.8永久代被移除。
虚拟机栈:执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
本地方法栈:与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
程序计数器:指示Java虚拟机下一条需要执行的字节码指令。
以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。
所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。
1. 饿汉模式
所谓饿汉模式就是立即加载,一般情况下再调用getInstancef方法之前就已经产生了实例,也就是在类加载的时候已经产生了。这种模式的缺点很明显,就是占用资源,当单例类很大的时候,其实我们是想使用的时候再产生实例。因此这种方式适合占用资源少,在初始化的时候就会被用到的类。
class SingletonHungary {
private static SingletonHungary singletonHungary = new SingletonHungary();
//将构造器设置为private禁止通过new进行实例化
private SingletonHungary() {
}
public static SingletonHungary getInstance() {
return singletonHungary;
}
}
2. 懒汉模式
懒汉模式就是延迟加载,也叫懒加载。在程序需要用到的时候再创建实例,这样保证了内存不会被浪费。针对懒汉模式,这里给出了5种实现方式,有些实现方式是线程不安全的,也就是说在多线程并发的环境下可能出现资源同步问题。
首先第一种方式,在单线程下没问题,在多线程下就出现问题了。
// 单例模式的懒汉实现1--线程不安全
class SingletonLazy1 {
private static SingletonLazy1 singletonLazy;
private SingletonLazy1() {
}
public static SingletonLazy1 getInstance() {
if (null == singletonLazy) {
try {
// 模拟在创建对象之前做一些准备工作
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
singletonLazy = new SingletonLazy1();
}
return singletonLazy;
}
}
3. 静态内部类
4. 静态代码块
这里提供了静态代码块实现单例模式。这种方式和第一种类似,也是一种饿汉模式。
5. 序列化与反序列化
LZ为什么要提序列化和反序列化呢?因为单例模式虽然能保证线程安全,但在序列化和反序列化的情况下会出现生成多个对象的情况。
多态意味着多个形式,同一个对象根据需求执行不同的操作。
可以使用两种方法来实现多态性,这两种方法是:
方法重载意味着使用相同的方法名在同一个类中写入两个或多个方法,但是传递的参数是不同的。
方法重写意味着我们在不同的类中使用同样方法名,这意味着父类方法在子类中使用。
在Java中,为了实现多态性,超类引用变量可以保存子类对象。
要实现多态性,每个开发人员必须在项目中使用相同的方法名。
置空将指针置空有助于检测一个指针指向的空间是否已经释放。
free(p);后p是一个非法的指针。不可以访问它。如果代码很长,误以为p合法,直接访问,有可能会造成程序崩溃。
不置空的话,在后面无法检测指针的合法性。我们在平时编程时,对空指针很容易检测(if(NULL==p)),但是对于非法指针p不为空,我们是无法检测到的。
防止对一个已经释放的指针多次释放造成程序崩溃,但是对一个null指针多次释放是合法的。
所以,我们在free后一定要将指针置空。
(1)如何避免野指针?
指针在被创建被初始化,将指针设置为NULL或让它指向合法的内存。 p = NULL;或:p = (char *)malloc(sizeof(char) * 8);
释放后清0。free(p); p = NULL;
索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。
索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。
为什么要建立索引,即索引的优点:
1) 建立索引的列可以保证行的唯一性,生成唯一的rowId;
2) 建立索引可以有效缩短数据的检索时间;
3) 建立索引可以加快表与表之间的连接;
4) 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。
3. 索引的缺点:
1) 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;
2) 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间),从而会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,这样会导致时间变长。
1.创建索引 首先应考虑在 where 及 order by 涉及的列上建立索引
2.避免在索引上使用计算
3.使用预编译查询
程序中通常是根据用户的输入来动态执行SQL,这时应该尽量使用参数化SQL,这样不仅可以避免SQL注入漏洞
攻击,最重要数据库会对这些参数化SQL进行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查询优化
并且执行预编译,这样以后再执行这个SQL的时候就直接使用预编译的结果,这样可以大大提高执行的速度。
4.调整Where字句中的连接顺序
DBMS一般采用自下而上的顺序解析where字句,根据这个原理表连接最好写在其他where条件之前,那些可以
过滤掉最大数量记录。
5.尽量将多条SQL语句压缩到一句SQL中
6.用where字句替换HAVING字句
避免使用HAVING字句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前
刷选记录,如果能通过where字句限制记录的数目,那就能减少这方面的开销。HAVING中的条件一般用于聚合函数
的过滤,除此之外,应该将条件写在where字句中。
7.使用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。这样就可以减少解析的时间并减
少哪些友列名歧义引起的语法错误。
8.用union all替换union
当SQL语句需要union两个查询结果集合时,即使检索结果中不会有重复的记录,如果使用union这两个结果集
同样会尝试进行合并,然后在输出最终结果前进行排序,因此如果可以判断检索结果中不会有重复的记录时候,应
该用union all,这样效率就会因此得到提高。
9.考虑使用“临时表”暂存中间结果
简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。 但是也得避免频繁创建和删除临时表,以减少系统表资源的消耗。
10.只在必要的情况下才使用事务begin translation
1、优化索引、sql语句、分析慢查询
2、设计表的时候严格根据数据的设计规范来设计数据库
数据库三范式:
第一范式:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性;
第二范式:满足一范式后,表中每一列必须有唯一性,都必须依赖于主键;
第三范式:满足二范式后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余。
3、使用缓存,吧经常访问到的数据而且不需要变化的数据放到缓存中
4、使用固态硬盘
5、采用MYSQL内部自带的表分区技术,吧数据分层到不同的文件中,能够提高餐盘的读写效率
6、垂直分表,吧一些不经常用到的数据放到一个表中,节约磁盘的I/O
7、主从分离读写,采取主从复制把数据库的读操作和写操作分离出来
8、数据库分表分机器(数据特变大的),主要的原理就是数据路由
9、选择合适的表引擎,对参数地上的优化
10、进行加购级别的缓存,静态化和分布式。
11、不采用全文索引吗,用什么搜什么
12、采用更快的处分方式,例如NoSql储存经常访问的数据
1.用Ping命令简单测网站速度的方法 ping www.XXX.com 查看最后一行最短时间、最长时间和平均时间(时间越短越好),这样你就能大致判断出网站的速度了。
2.用tracert命令简单测网站速度的方法 tracert就是用来检测从终端客户到你的服务器所在机房的“跳数”和响应时间,也就是测试出服务器与全国各地客户的连接速度,当到达任何一个网关的时候,tracert会进行三次测试,并把三次测试的结果以ms为单位显示,当然time时间越短越好。
3.全方位的免费网站速度测试工具 — GTmetrix
测试人员应该怎么做:
1. 在出现BUG 特别是偶然性BUG 时一定做好BUG 纪录。BUG 纪录要包含以下内容。
(1) BUG 出现时测试的测试Case ,要验证的内容等。
(2) 测试的软件和产品的版本
(3) 测试环境,特别是硬件要求,软件环境,约束条件。
(4) 测试手顺以及输入条件等,也就是操作步骤,这个必须详细的记录。
(5) 预期的正常结果是什么。
(6) BUG 现象。要详细记录。最好可以截图或者拍照等。
(7) 记录复归步骤及条件。
(8) BUG 发生的概率。
总之,当发生BUG 时一定第一时间记录,而且尽可能详细记录。
2. 保存BUG 发生时的LOG 和数据( 发生错误时的各种变量、内存、存储器等数据内容) 。
3. 当测试人员发现有偶然BUG 或者是难以再现的BUG 时,要仔细查看当时的测试环境,比如测试的机器上有没有安装特别的软件之类的,由没有病毒,并详细记录。如果有必要一定要把测试环境进行保护。以便开发人员进行确认和再现。
用Chrome浏览器的控制台 network就可以看到接口响应时间,以及页面加载总时间
(7)数据库表结构存在,如何插入大量数据?
若给出头结点和要删除的节点i,首先判断i是否为尾节点(i.next=null),若不是尾节点,则将后面一个节点j的值覆盖到节点i,然后将i节点指向j的下一个节点
if( i.next!=null) {
node j=i.next;
i.value=j.value;
i.next=j.next;
relax j;
}
需要考虑的特殊情况有:
1.只有一个节点,即头结点等于尾节点,那么只能删除该唯一的元素,即将头结点设为null。
2.若删除的节点为尾节点,则不能有复制的方法,只能从头到尾,依次遍历整个链表找到尾节点的前一个节点,然后将它置为尾。
3,若该节点即不是头结点也不是尾节点,则,可用上述代码思路完成,时间复杂度为O(1)。
思路一:
若是单向链表,则需要先计算得到链表的长度,才能找到倒数第k个元素,这样需要遍历两次链表,时间效率不高
思路二:
可以设置两个指针——1号和2号
1号指针先走k-1步。然后2号指针从头开始,1号指针从k-1开始,两个以相同的步调同时前进,当1号指针到到链表尾时,2号指针所指向的元素即为倒数第K个元素。
C++代码如下所示
这里还需要考虑几个边界问题,
1.若链表的长度小于k。
2.若输入的参数K是个负数或者0。
3.链表的头结点为null,可以归纳到长度小于k一类中进行处理。
因此,程序思考要全面,具有鲁棒性
定义两个指针,一个一次走一步,一个一次走两步,若有环,则走 两步的指针会追上走一步的指针
统计一篇很长的英文文章中频次出现最高的10个单词。
topK问题
在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为topK问题。
N个数中取最大的K个数,用小根堆;N个数中取最小的K个数,用大根堆;时间复杂度O(NlogK)。
例题1:100万个数中,找到其中最大的100个数。(N个数中取最大的K个数)
思路:
(1) 定义两个数组,arr用于存储海量数据N,top用于存储小根堆K;
(2) 将海量数据的前K个元素先填满top堆;
(3) 调整top堆为最小堆结构;
(4) 通过遍历将新数据与堆顶元素(此时堆顶元素最小)比较,大于堆顶元素就入堆,并下调堆结构。
(5) 遍历结束,则堆中的元素即N个数中最大的前K个数。
mapReduce
(1)网络安全,虚拟化,云计算,大数据,网络优化你了解什么?
参考链接:
https://blog.csdn.net/qq_38265137/article/details/93379922
https://blog.csdn.net/m0_37925202/article/details/80214095
https://blog.csdn.net/qq_24499615/article/details/80012470
https://blog.csdn.net/yuan_baba/article/details/82020956