为何mongodb好占用导致电脑物理内存占用过高怎么办暴涨,如何优化

总结一下:运维工程师面试的经历及面试相关问题(下篇)
上文回顾【总结一下:运维工程师面试的经历及面试相关问题】
一次偶然的机会,笔者在一个招聘平台中刷新岗位的时候突然看到一个新发布的岗位,仔细一看是海外的岗位,上面写的待遇、福利、工作内容笔者都有点兴趣,由于笔者也没有尝试过海外面试的机会和感觉,所以就和发布这个岗位的猎头联系上了。
猎头问我要了简历,并把个人信息详细丰富了一下,比如有没有护照、工作了多久、个人职业规划、期望到手的薪资等等。猎头就把我的简历和详细的个人信息推荐出去了,过了几天时间,猎头通知我简历筛选通过了,约个时间可以进行技术面试(电话面试),然后就这样约在了号上午。
虽然这次是海外面试,但是面试官是我们华人,和面试官在电话中将近聊了2个小时左右,笔者聊的也口干舌燥。这一次面试官将近问了40个左右的问题,量实大有点大,笔者也没记住这么多,大概记住了30多个问题,忘记开录音了,不然这些问题都能分享出来。别看是海外的面试官,其实这次所问的问题在我们国内的面试中也常常会问到的,我们先来看一下海外的公司的岗位要求吧:
岗位职责:
1、日常线上项目的需求处理;
2、新项目上线对接的相关工作;
3、日常运维工具开发、维护、优化;
4、监控业务的运行状态,及时处理项目运行中出现的故障,保障项目服务24x7稳定运行;
5、分析排除系统、数据库、网络、应用等故障及错误;
6、负责服务器的资源调配和系统安全、数据备份。
任职要求:
1. 熟悉linux操作系统, 熟练使用一种或多种脚本语 言(例如 Python/Perl/Shell);
2. 熟悉至少一种共有云技术,多种运维平台工具(Nagios, Zabbix,Puppet等)
3. 熟悉Nginx,Mysql, Redis, Keepalived, LVS等中间件的配置与调优;
4. 熟悉网络部署,多种数据机房故障的发现和排除的工具,有做个跨机房数据同步的优先;
5. 熟悉mysql、redis、mongoDB的安装、维护、性能优化;
6. 了解反向代理、负载均衡原理.
7. 有责任心,耐心,积极肯学的心态以及良好的沟通表达能力和团队合作精神;
其实这个要求,我在上一篇文章也说到过,大多数公司都写得差不多,很多公司自己懒的写,直接照搬别的公司发出来岗位要求,所以我们只要了解它就可以了,面试的时候不一定会问到这些岗位的要求说明,你看这家公司没有写熟悉TCP/IP,其实面试官这一次有问到TCP/IP这个问题的。这次技术面试后总体面试官还是比较满意,后来猎头通知我一面过了,准备安排号下午进行二面(跟我谈薪资、对海外工作的想法、人生规划等话题)。好了,不多说了,大家自己慢慢看我和面试官聊的技术问题吧。
1、介绍下自己?
笔者回答:不管是电话面试还是现场面试,自我介绍是避免不了的,上一篇文章我有详细介绍这块的内容,这里不做解释了,感兴趣的朋友参考我上一篇文章。
2、为什么想着要离开现在的公司?
笔者回答:虽然是面试技术,但也会有很多面试官会不经意的问你这个问题,看起来很随意的问题,其实这个问题里面隐藏了很多信息,最直观的就是看你这个人对企业的忠诚度、还能看你是不是心浮气燥的性格等等。如果你曾经频繁跳过槽,不管出于什么原因,笔者个人都不建议写在简历上,最好能够合并一些工作时间和单位,企业是很担心把你招来后会不会短时间你又跳槽了。当然如果都是因为企业经营不善倒闭所至,就没关系了。说到这里,就想起了笔者曾经一位同事,连续在好几家单位都干倒闭了,这我也不知道说啥好了。。。好了,咋们接着往下走。
3、TCP/IP原理说一下?TCP有哪几个状态,分别是什么意思?
笔者回答:以tcp/ip协议为核心,分五层。tcp工作在第4层,主要有tcp和udp协议。其中tcp是可靠协议,udp是不可靠协议。 tcp传输之前,需要建立连接,通过三次握手实现。
TCP三次握手状态:首先是closed状态,当发起连接后,进入Listen状态,当三次握手之后,进入EST状态。三次握手中间还有一个临时状态:SYN_SENT。SYN_SENT 当应用程序发送ack之后,进入EST状态,如果没有发送,就关闭closed.
总结:大家一定要熟记tcp状态转换图,参考 http://blog.csdn.net/wenqian1991/article/details/如下图:
4、有个客户说访问不到你们的网站,但是你们自己测试内网和外网访问都没问题。你会怎么排查并解决客户的问题?
笔者回答:我们自己测了都没问题,只是这个客户访问有问题,那肯定是要先联系到这个客户,能远程最好,问一下客户的网络是不是正常的,访问其它的网站有没有问题(比如京东、百度什么的)。如果访问其它网站有问题,那叫客户解决本身网络问题。如果访问其它网站都没问题,用ping和nslookup解析一下我们的网站是不是正常的,让客户用IP来访问我们的网站是否可行,如果IP访问没问题,那就是客户的DNS服务器有问题或者DNS服务器解析不到我们的网站。还有一种可能就是跨运营商访问的问题,比如我们的服务器用的是北方联通、而客户用的是南方移动,就也有可能突然在某个时间段访问不到,这种情况在庞大的中国网络环境中经常发生(一般是靠CDN解决)。还有可能就是我们的网站没有SSL证书,在公网是使用的是http协议,这种情况有可能就是没有用https协议网站被运营商劫持了。
5、redhat 6.X版本系统 和 centos 7.X版本有啥区别?
笔者回答:桌面系统(6/GNOE2.x、7/GNOME3.x)、文件系统(6/ext4、7/xfs)、内核版本(6/2.6x、7/3.10x)、防火墙(6/iptables、7/firewalld)、默认数据库(6/mysql、7/mariadb)、启动服务(6/service启动、7/systemctl启动)、网卡(6/eth0、7/ens192)等。
6、你会用什么方法查看某个应用服务的流量使用情况?
笔者回答:如果是单一应用的服务器,只需要用iftop、sar等工具统计网卡流量就可以。如果服务器跑了多个应用,可以使用nethogs工具实现,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况。
7、说一下你们公司怎么发版的(代码怎么发布的)?
笔者回答:我说什么来着,这个问题又问到了。发布:jenkins配置好代码路径(SVN或GIT),然后拉代码,打tag。需要编译就编译,编译之后推送到发布服务器(jenkins里面可以调脚本),然后从分发服务器往下分发到业务服务器上。
8、elk中的logstash是怎么收集日志的,在客户端的logstash配置文件主要有哪些内容?
笔者回答:input、output两大块配置;input中指定日志(type、path)等,output指定日志输出的目标(host、port)等。
9、ansible你用过它的哪些模块,ansbile同时分发多台服务器的过程很慢(它是逐台分发的),你想过怎么解决吗?
笔者回答:用过ansible的(copy file yum ping command shell)等模块;ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你有大量的机器需要控制,或者你希望减少进程数,那你可以采取异步执行.ansible的模块可以把task放进后台,然后轮询它.这使得在一定进程数下能让大量需要的机器同时运作起来.
10、nginx有哪几种调度算法,解释一下ip hash和轮询有啥不一样?
笔者回答:常用的有3种调度算法(轮询、ip hash、权重)。
轮询:upstream按照轮询(默认)方式进行负载,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
ip hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
权重:指定轮询几率,权重(weight)和访问比率成正比,用于后端服务器性能不均的情况。
11、nginx你用到了哪些模块,在proxy模块中你配置过哪些参数?
笔者回答:用到过(负载均衡upstream、反向代理proxy_pass、location、rewrite等)。
proxy模块中配置过:proxy_set_header、proxy_connect_timeout、proxy_send_timeout、proxy_buffer_*
12、说一下iptables的原理,有哪些表、哪些链?怎么修改默认策略全部为DROP?
笔者回答:iptables是工作在TCP/IP的2、3、4层。你要说它的原理也不是几话能概括的,当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发。
4张表(raw表、mangle表、net表、filter表)
5条链(INPUT链、OUTPUT链、PORWARD链、PREROUTING链、POSTROUTING链)。
全部设置为DROP:
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
小结:iptables远不止这几句话就能描述清楚的,也不是随便在网上趴些资料就能学好的,需要自己用起来,经过大量的实验和实战才能熟悉它,iptables真的很考验运维人员的技术水平,大家一定要用心学好这个iptables。
13、如何开启linux服务器路由转发功能?
笔者回答:echo "1" & /proc/sys/net/ipv4/ip_forward
14、nginx中rewrite有哪几个flag标志位(last、break、redirect、permanent),说一下都什么意思?
笔者回答:
last : 相当于Apache的[L]标记,表示完成当前的rewrite规则
break : 停止执行当前虚拟主机的后续rewrite指令集
redirect : 返回302临时重定向,地址栏会显示跳转后的地址
permanent : 返回301永久重定向,地址栏会显示跳转后的地址
301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后匹配
break和last都能组织继续执行后面的rewrite指令
总结:关于nginx rewrite用法,笔者看到一篇文章总结的挺不错 ,可以参考一下 https://www.jianshu.com/p/a1fce9358d44
15、你在shell脚本中用过哪些语法,case语法会用到哪些地方?
笔者回答:一般会用到if语句、for语句、while语句、case语句以及function函数的定义;case语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。最典型的case语法会用到启动服务脚本的处理。
16、linux系统中你会用到什么命令查看硬件使用状态信息?
笔者回答:这个命令就很多了,比如:lscpu(查看cpu信息)、free -m(查看内存信息)、df -h(查看硬盘分区信息)、top(还可以动态查看cpu、内存使用情况的信息),/proc/目录下也可以查看很多硬件信息。
17、我要过滤一段文本(test.txt)中第二列的内容?如果这段文件有很多特殊符号,比如用:(冒号)怎么过滤它的第二段?如果我要过滤这段文本中,其中有一行只有7个符如何实现?
笔者回答: awk '{print $2}' tset.txt
awk -F':' '{print $2}' tset.txt
18、比如开发想找你查看tomcat日志,但是catalia.out特别大,你不可能用vi打开去看,你会怎么查看?如果你用 grep -i"error" 过滤只是包含error的行,我想同时过滤error上面和下面的行如何实现?
笔者回答:grep -i "error" catalia.out
grep -C 1 -i "error" catalia.out
参数-C:是匹配前后的行,后面1是匹配前后各1行
19、 怎么编写一个定时计划任务?里面用到的最小单位是什么?
笔者回答:crontab -e,最小单位是分钟
20、zabbix如何修改其中监控的一台服务器中内存阈值信息,比如正常内存使用到了80%报警,我想修改为60%报警?
笔者回答:正常来说,一般会把监控的服务器统一加入到一个模板中,修改模板的其是某一项的监控项参数和告警阈值后,加入模板中的所有主机都会同步。如果单独想修改其中某一台服务器内存告警阈值,需要进入这台主机,单独创建一个告警Triggers,关联这台主机监控内存的项,配置好告警的阈值为60%即可实现。其实,zabbix一切都为图形化操作,如果没有接触过zabbix的朋友,可能听起来不太清楚。
21、mysql主从复制原理说一下?
笔者回答:mysql支持三种复制类型(基于语句的复制、基于行的复制、混合类开进的复制)。
如果你记不住太多内容,可以简单说明一下原理:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
如果你能详细记住它的原理,可以这么回答:
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
22、用什么命令可以查看上一次服务器启动的时间、上一次谁登录过服务器?
笔者回答:w命令查看上次服务器启动时间。last命令 查看登录。
23、redis集群原理说一下,正常情况下mysql有多个库,redis也有多个库,我怎么进入redis集群中的第2个库?还有,我想查看以BOSS开头的值?redis持久化是如何实现(一种是RDS、一种是AOF),说一下他们有啥不一样?
笔者回答:这个redis原理的问题又问到了,看样子很多面试官都很关心这个redis,在上一篇文章笔者的一次面试也有这个面试问题。
【集群原理】:其实它的原理不是三两句话能说明白的,redis 3.0版本之前是不支持集群的,官方推荐最大的节点数量为1000,至少需要3(Master)+3(Slave)才能建立集群,是无中心的分布式存储架构,可以在多个节点之间进行数据共享,解决了Redis高可用、可扩展等问题。集群可以将数据自动切分(split)到多个节点,当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。
【切库】:单机情况下用select 2可以切换第2个库,select 1可以切换第1个库。但是集群环境下不支持select。可参考https://yq.aliyun.com/articles/69349
【redis持久化】:持久化通俗来讲就是将内存中的数据写入硬盘中,redis提供了两种持久化的功能(RDB、AOF),默认使用RDB的方式。
RDB:全量写入持久化,而RDB持久化也分两种(SAVE、BGSAVE)。
SAVE是阻塞式的RDB持久化,当执行这个命令时redis的主进程把内存里的数据库状态写入到RDB文件(即上面的dump.rdb)中,直到该文件创建完毕的这段时间内redis将不能处理任何命令请求。
BGSAVE属于非阻塞式的持久化,它会创建一个子进程专门去把内存中的数据库状态写入RDB文件里,同时主进程还可以处理来自客户端的命令请求。但子进程基本是复制的父进程,这等于两个相同大小的redis进程在系统上运行,会造成内存使用率的大幅增加。
AOF:与RDB的保存整个redis数据库状态不同,AOF的持久化是通过命令追加、文件写入和文件同步三个步骤实现的。AOF是通过保存对redis服务端的写命令(如set、sadd、rpush)来记录数据库状态的,即保存你对redis数据库的写操作。
为了大家能够更好的理解redis持久化,笔者建议大家可以看下这两篇文章会比较好理解:
https://www.cnblogs.com/Fairy-02-11/p/6182478.html
http://blog.csdn.net/mishifangxiangdefeng/article/details/
24、你在工作的过程中,遇到过你映像最深的是什么故障问题,你又是如何解决?
笔者回答:这个问题主要也是考你排查故障的思路及用到的相关命令工具,其每个人在工作中都会遇到各种各样的问题(不管是网络问题、应用配置问题、还是APP打开慢/网站打开慢)等等。你只要记住一个你映像最为深刻、最为典型的故障就行。笔者也遇到过各种问题,我在这里就是写出来,怕误导了大家。
25、在linux服务器上,不管是用rz -y命令还是tftp工具上传,我把本地的一个文件上传到服务器完成后,服务器上还是什么都没有,这有可能是什么问题?
笔者回答:根据这种现象有可能是:服务器磁盘满了;文件格式破坏了;或者你用的是普通用户上传,正好上传的目录没有权限;还有可能就是你上传的文件大小超出了该目录空间的范围。
26、你在工作中都写过什么脚本?
笔者回答:这个问题的回答别把话说得太大了,要结合实际情况来回答。写过mysql、redis、mongodb等数据库备份的脚本;服务器文件备份的脚本;日常代码发布的脚本;之前用nagios的时候写过一些nagios插件的脚本。
27、rsync+inotify是实现文件实时同步的,加什么参数才能实现实时同步,--delete参数又是什么意思?
笔者回答:rsync是远程同步工具、inotify是一种强大的异步文件系统系统监控机制。通过inotifywait 中的-m参数可以实现“始终保持事件监听状态”。rsync中的-delete参数是指“ 删除那些DST中SRC没有的文件”。
28、我想查看access.log中哪个IP访问最多?
笔者回答:awk '{print $1}' access.log| sort | uniq -c |sort -rn -k 1 | head -1
上面的具体参数如果有不知道的,大家可以自行百度一下,这里不说参数这么细节的问题
29、在linux系统中,一般都会有swap内存,你觉得使用swap内存有什么好处,在什么情况下swap内存才会被使用?你觉得在生产环境中要不要用swap内存?
笔者回答:好处:在内存不够用的时候,将部分内存上的数据交换到swap空间上,以便让系统不会因为内存不够用而导致oom或者更致命的情况出现。
什么情况下会用swap:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到swap空间中,等到那些程序要运行时,再从swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行swap交换。
30、怎么查看两台服务器之间的网络是不是正常的,服务器是禁ping的?
笔者回答:不能用ping,那可以用telnet对方服务器的端口、或者互相访问对方打开的服务。其它的测试方法笔者也没想到,要是哪位朋友有好的方法不访在下面留言讨论。
31、比如我访问百度网站,有什么方法可以跟踪经过了哪些网络节点?
笔者回答:这个太简单了吧,干运维必备的网络排查技能。用tracert命令就可以跟踪,主要是查询本机到另一个主机经过的路由跳数及数据延迟情况。然后你也可以把具体跟踪后输出的信息也说出来,你能说出来都是为你加分的。
32、如果你们公司的网站访问很慢,你会如何排查?
笔者回答:看到没有,又问到了这个问题,笔者在上一篇文章 号的面试中面试官也问到同样的问题。其实这种问题都没有具体答案,只是看你回答的内容与面试官契合度有多高,能不能说到他想要的点上,主要是看你排查问题的思路。我是这么说的:问清楚反应的人哪个服务应用或者页面调取哪个接口慢,叫他把页面或相关的URL发给你,首先,最直观的分析就是用浏览器按F12,看下是哪一块的内容过慢(DNS解析、网络加载、大图片、还是某个文件内容等),如果有,就对症下药去解决(图片慢就优化图片、网络慢就查看内网情况等)。其次,看后端服务的日志,其实大多数的问题看相关日志是最有效分析,最好用tail -f 跟踪一下日志,当然你也要点击测试来访问接口日志才会打出来。最后,排除sql,,找到sql去mysql执行一下,看看时间是否很久,如果很久,就要优化SQL问题了,expain一下SQL看看索引情况啥的,针对性优化。数据量太大的能分表就分表,能分库就分库。如果SQL没啥问题,那可能就是写的逻辑代码的问题了,一行行审代码,找到耗时的地方改造,优化逻辑。
33、我需要查看某个时间段的日志(比如access.log日志),如何实现?
笔者回答:方法有很多种,比如我要看查的时间是号--1月10号的日志吧。
比如可以用sed命令,格式为:sed -n '/起始时间/,/结束时间/p' 日志文件,如下:
sed -n '/09/Jan/2018/,/10/Jan/2018/p' access.log
比如可以用grep,格式为:grep -E '起始时间|结束时间' 日志文件,如下:
grep -E '09/Jan/2018|10/Jan/2018' access.log
当然,你还可以结合cat、grep 、awk这些命令一起来使用都行。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点发布于 07/03 22:26
1. 主键 超键 候选键 外键
表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。
是最小超键,即没有冗余元素的超键。
在一个表中存在的另一个表的主键称此表的外键。
2.数据库事务的四个特性及含义
数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:隔离状态执行事务,使它们好像是在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
3.视图的作用,视图可以更改么?
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。 视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。 创建视图:create view XXX as XXXXXXXXXXXXXX; 对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
4.drop,delete与truncate的区别
drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句。
(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop & truncate & delete
(4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
(8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚
(9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10) Truncate table 表名 速度快,而且效率高,因为: truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
5.索引的工作原理及其种类
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
上图展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)的复杂度内获取到相应数据。
创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列上创建索引:在经常需要搜索的列上,可以加快搜索的速度;在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
根据数据库的功能,可以在器中创建三种索引:唯一索引、主键索引和聚集索引。
唯一索引是不允许其中任何两行具有相同索引值的索引。
当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。&主键索引&数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。&聚集索引&在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。
如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
局部性原理与磁盘预读
由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。程序运行期间所需要的数据通常比较集中。
由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。
预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
B-/+Tree索引的性能分析
到这里终于可以分析B-/+Tree索引的性能了。
上文说过一般使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多需要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:
每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3)。
而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。
综上所述,用B-Tree作为索引结构效率是非常高的。
6.连接的种类
查询分析器中执行: --建表table1,table2: create table table1(id int,name varchar(10)) create table table2(id int,score int) insert into table1 select 1,'lee' insert into table1 select 2,'zhang' insert into table1 select 4,'wang' insert into table2 select 1,90 insert into table2 select 2,100 insert into table2 select 3,70 如表 ------------------------------------------------- table1 | table2 | ------------------------------------------------- id name |id score | 1 lee |1 90| 2 zhang| 2 100| 4 wang| 3 70| -------------------------------------------------
以下均在查询分析器中执行 一、外连接 1.概念:包括左向外联接、右向外联接或完整外部联接
2.左连接:left join 或 left outer join (1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。 (2)sql 语句 select * from table1 left join table2 on table1.id=table2.id -------------结果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 4wangNULLNULL ------------------------------ 注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
3.右连接:right join 或 right outer join (1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。 (2)sql 语句 select * from table1 right join table2 on table1.id=table2.id -------------结果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 NULLNULL370 ------------------------------ 注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
4.完整外部联接:full join 或 full outer join (1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 (2)sql 语句 select * from table1 full join table2 on table1.id=table2.id -------------结果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 4wangNULLNULL NULLNULL370 ------------------------------ 注释:返回左右连接的和(见上左、右连接)
二、内连接 1.概念:内联接是用比较运算符比较要联接列的值的联接
2.内连接:join 或 inner join
3.sql 语句 select * from table1 join table2 on table1.id=table2.id -------------结果------------- idnameidscore ------------------------------ 1lee190 2zhang2100 ------------------------------ 注释:只返回符合条件的table1和table2的列
4.等价(与下列执行效果相同) A:select a.*,b.* from table1 a,table2 b where a.id=b.id B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)
三、交叉连接(完全)
1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)
2.交叉连接:cross join (不带条件where...)
3.sql语句 select * from table1 cross join table2 -------------结果------------- idnameidscore ------------------------------ 1lee190 2zhang190 4wang190 1lee2100 2zhang2100 4wang2100 1lee370 2zhang370 4wang370 ------------------------------ 注释:返回3*3=9条记录,即笛卡尔积
4.等价(与下列执行效果相同) A:select * from table1,table2
7.数据库范式
1 第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
2 第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。 第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
3 第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。(我的理解是消除冗余)
8.数据库优化的思路
这个我借鉴了慕课上关于数据库优化的课程。
1.SQL语句优化
1)应尽量避免在 where 子句中使用!=或&&操作符,否则将引擎放弃使用索引而进行全表扫描。 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3)很多时候用 exists 代替 in 是一个好的选择 4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤
2.索引优化
看上文索引
3.数据库结构优化
1)范式优化: 比如消除冗余(节省空间。。) 2)反范式优化:比如适当加冗余等(减少join) 3)拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。 4)拆分其实又分垂直拆分和水平拆分: 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据可以到千万&垂直拆分:&解决问题:表与表之间的io竞争 不解决问题:单表中数据量增长出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上&水平拆分:&解决问题:单表中数据量增长出现的压力 不解决问题:表与表之间的io争夺 方案: 用户表通过性别拆分为男用户表和女用户表 订单表通过已完成和完成中拆分为已完成订单和未完成订单 产品表 未完成订单放一个server上 已完成订单表盒男用户表放一个server上 女用户表放一个server上(女的爱购物 哈哈)
4.服务器硬件优化
这个么多花钱咯!
9.存储过程与触发器的区别
触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。
10.面试回答数据库优化问题从以下几个层面入手
(1)、根据服务层面:配置mysql性能优化参数;
(2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。
(3)、从数据库层面增强性能:优化SQL语句,合理使用字段索引。
(4)、从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。
(5)、减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。
(6)、不常使用的数据迁移备份,避免每次都在海量数据中去检索。
(7)、提升数据库服务器硬件配置,或者搭建数据库集群。
(8)、编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);
本文转载自:https://blog.csdn.net/boonya/article/details/
人打赏支持
码字总数 3337
今天阿里数据库不再是简单的电商业务,而是涵盖了视频娱乐、IM、地图、在线零售、新零售、物流、在线旅游、音乐、IoT等纵多领域。2017年双十一交易额达1682亿,数据库交易峰值也以数十倍的速...
  “在昨天下午北京云栖大会TechInsight,阿里巴巴数据库团队的8位专家一同分享了阿里数据库最佳实践。超大规模的业务压力,在阿里巴巴内部淬炼出了一套完整的企业数据库解决方案:超大数据...
大数据头条
优化的分类:(实例优化+库的优化=数据库优化) 一、实例的优化 二、库的优化 三、sql的优化 数据库性能问题,95%由用户所写的sql引起,其他由库引起。 优化步骤: 1、定位问题 1&通过v$ 动态...
服务器安全狗V4.1增强版发布咯,用户朋友们可直接在线升级或到官网下载安装使用。 日发布,服务狗主要针对以下几点进行支持和修复: 1、防护日志右键支持添加到黑白名单的功能,并...
小猪猪的风
MySQL数据库的性能的影响 一. 服务器的硬件的限制 二. 服务器所使用的操作系统 三. 服务器的所配置的参数设置不同 四. 数据库存储引擎的选择 五. 数据库的参数配置的不同 六. (重点)数据库的...
Panda_Jerry
一、oracle 就业方向 1、DBA 一般初级开始 2、数据开发 压力相对较少,但工资较少 (SQL、PLSQL精通就可以了) 3、数据挖掘 (数据库优化) 4、BI界面设计 5、数据仓库 二、技术要求 1、不同...
  【IT168 技术】今天的世界已经是一个大数据的世界,伴随数据量爆发式增长的还有硬件的计算能力、不断增强的CPU计算能力和单位GB内存价格的不断下降,更好地利用这些强大的资源是大势所趋...
“2017年度十大MVP评选”已圆满落幕,再次感谢这10位获奖专家及团队为知识传播的努力、对技术分享的热忱、为行业发展的贡献,在此将他们这一年来分享过的干货好文遴选出来,以便大家温故知新...
DBAplus社群
Oracle DBA必备:Oracle高级管理教程和排错、优化文档 我们经常发现这样一种情况,我们在大学里所学的数据库那点东西,到了实际工作里往往让我们手足无措。看似简单的数据库却成了我们工作、...
文章回顾: PS:秋色园QBlog下载地址:http://www.cyqdata.com/download/article-detail-427 上节回顾: 上节 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十...
没有更多内容
加载失败,请刷新页面
public enum EventType {
IP_CHANGE,REGISTER_SERVER}
static public class Entry{
private EventType eventT
private CopyOnWriteArrayList&E......
SaintTinyBoy
日,Container Day 2018 (即Rancher Kubernetes企业用户大会)如期召开,Rancher Labs CEO及联合创始人梁胜深入解读了容器技术现状及发展趋势,为整场大会奏响了持续技术创新和尊...
RancherLabs
用tf 对 一次函数进行拟合 效果 loss 简单实现如下 import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt# 保存显示数据plotdata = {"batchsize": [], "los...
JupyterLab安装地图插件 (本文所述软件还在发展之中,欢迎加入开源项目,提供建议、测试和开发。) 在Jupyter中进行数据分析时,往往需要将数据叠加到地图上。简单的可以利用matplotlib/ec...
openthings
资源整理 1 Coding: 1.Python项目,由Allen Downey撰写的Think Python第二版的LaTeX源代码和支持代码。 ThinkPython2 2.R语言包h3jsr,h3jsr使用V8的神奇力量通过其javascript绑定提供对Ube...
插入删除log(N) TODO
梦想游戏人
Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic。 今天就结合最近的世界杯带大家理解下装饰器。...
Xshell登录阿里云服务器ECS 1. 参考资料: 1). 《阿里云服务器怎么用?阿里云服务器使用教程》 链接:http://www.cr173.com/html/50758_1.html 2). eagle-zhang的CSDN博客《Xshell连接不上阿...
在前后端分离项目,前后端通过api进行通信。如果用postman免费版进行api测试的话,由于无法保存测试脚本到文件,不方便前端查看。 你可以选择付费版。也可以利用IDEA自带的HTTP Client Edito...
摘要 : 最近有些用户反映某个Chrome插件在安装的时候,提示“只能通过Chrome网上应用商店安装该程序”,为了解决这一问题,Chrome插件网带来了相关的解决方法。 某些用户在Chrome插件网下载了...
没有更多内容
加载失败,请刷新页面
文章删除后无法恢复,确定取消删除此文章吗?
亲,自荐的博客将通过私信方式通知管理员,优秀的博客文章审核通过后将在博客推荐列表中显示
确定推荐此文章吗?
确定推荐此博主吗?
聚合全网技术文章,根据你的阅读喜好进行个性推荐
指定官方社区
深圳市奥思网络科技有限公司版权所有}

我要回帖

更多关于 物理内存过高怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信