手撕面试官系列(五):Tomcat+Mysql+设计模式面试专题
发布日期:2021-05-04 01:05:56 浏览次数:37 分类:技术文章

本文共 18831 字,大约阅读时间需要 62 分钟。

Tomcat

1 、Tomcat 的缺省端口是多少,怎么修改?

1)找到 Tomcat 目录下的 conf 文件夹

2)进入 conf 文件夹里面找到 server.xml 文件
3)打开 server.xml 文件
4)在 server.xml 文件里面找到下列信息

port="8080"改成你想要的端口

2 、tomcat 有哪几种 Connector 运行模式( 优化) ?

bio:传统的 Java I/O 操作,同步且阻塞 IO。

maxThreads=”150”//Tomcat 使用线程来处理接收的每个请求。这个值表示
Tomcat 可创建的最大的线程数。默认值 200。可以根据机器的时期性能和内存
大小调整,一般可以在 400-500。最大可以在 800 左右。
minSpareThreads=”25”—Tomcat 初始化时创建的线程数。默认值 4。如果
当前没有空闲线程,且没有超过 maxThreads,一次性创建的空闲线程数量。
Tomcat 初始化时创建的线程数量也由此值设置。
maxSpareThreads=”75”–一旦创建的线程超过这个值,Tomcat 就会关闭不
再需要的 socket 线程。默认值 50。一旦创建的线程超过此数值,Tomcat 会关
闭不再需要的线程。线程数可以大致上用 “同时在线人数每秒用户操作次数系
统平均操作时间” 来计算。
acceptCount=”100”—-指定当所有可以使用的处理请求的线程数都被使用
时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。默认值
10。如果当前可用线程数为 0,则将请求放入处理队列中。这个值限定了请求
队列的大小,超过这个数值的请求将不予处理。
connectionTimeout=”20000” –网络连接超时,默认值 20000,单位:毫
秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
nio:JDK1.4 开始支持,同步阻塞或同步非阻塞 IO。
指定使用 NIO 模型来接受 HTTP 请求
protocol=”org.apache.coyote.http11.Http11NioProtocol” 指定使用 NIO 模型
来接受 HTTP 请求。默认是 BlockingIO,配置为 protocol=”HTTP/1.1”
acceptorThreadCount=”2” 使用 NIO 模型时接收线程的数目
aio(nio.2):JDK7 开始支持,异步非阻塞 IO。
apr:Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来
处理文件读取或网络传输操作,从而大大地 提高 Tomcat 对静态文件的处理性
能。

<Connector port=“8080”

protocol=“org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=“20000”
redirectPort="8443
maxThreads=“500”
minSpareThreads=“100”
maxSpareThreads=“200”
acceptCount=“200”
enableLookups=“false”
/>
其他配置
maxHttpHeaderSize=“8192” http 请求头信息的最大程度,超过此长度的部分
不予处理。一般 8K。
URIEncoding=“UTF-8” 指定 Tomcat 容器的 URL 编码格式。
disableUploadTimeout=“true” 上传时是否使用超时机制
enableLookups=“false”–是否反查域名,默认值为 true。为了提高处理能力,
应设置为 false
compression=“on” 打开压缩功能
compressionMinSize=“10240” 启用压缩的输出内容大小,默认为 2KB
noCompressionUserAgents=“gozilla, traviata” 对于以下的浏览器,不启用
压缩
compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain”
哪些资源类型需要压缩

3 、Tomcat 有几种部署方式?

1)直接把 Web 项目放在 webapps 下,Tomcat 会自动将其部署

2)在 server.xml 文件上配置节点,设置相关的属性即可
3)通过 Catalina 来进行配置:进入到 conf\Catalina\localhost 文件下,创建一个
xml 文件,该文件的名字就是站点的名字。
编写 XML 的方式来进行设置。

4 、tomcat 容器是如何创建 servlet 类实例?用到了什么原理?

当容器启动时,会读取在 webapps 目录下所有的 web 应用中的 web.xml 文

件,然后对 xml 文件进行解析,
并读取 servlet 注册信息。然后,将每个应用中注册的 servlet 类都进行加载,
并通过反射的方式实例化。
(有时候也是在第一次请求时实例化)在 servlet 注册时加上如果为正数,则在
一开始就实例化,
如果不写或为负数,则第一次请求实例化。

5.tomcat 如何优化?

1、优化连接配置.这里以 tomcat7 的参数配置为例,需要修改 conf/server.xml

文件,修改连接数,关闭客户端 dns 查询。
参数解释:
URIEncoding=”UTF-8″ :使得 tomcat 可以解析含有中文名的文件的 url,真
方便,不像 apache 里还有搞个 mod_encoding,还要手工编译
maxSpareThreads : 如果空闲状态的线程数多于设置的数目,则将这些线程中
止,减少这个池中的线程总数。
minSpareThreads : 最小备用线程数,tomcat 启动时的初始化的线程数。
enableLookups : 这个功效和 Apache 中的 HostnameLookups 一样,设为关
闭。
connectionTimeout : connectionTimeout 为网络连接超时时间毫秒数。
maxThreads : maxThreads Tomcat 使用线程来处理接收的每个请求。这个值
表示 Tomcat 可创建的最大的线程数,即最大并发数。
acceptCount : acceptCount 是当线程数达到 maxThreads 后,后续请求会被放
入一个等待队列,这个 acceptCount 是这个队列的大小,如果这个队列也满
了,就直接 refuse connection
maxProcessors 与 minProcessors : 在 Java 中线程是程序运行时的路径,是
在一个程序中与其它控制线程无关的、能够独立运行的代码段。它们共享相同
的地址空间。多线程帮助程序员写出 CPU 最 大利用率的高效程序,使空闲时
间保持最低,从而接受更多的请求。
通常 Windows 是 1000 个左右,Linux 是 2000 个左右。
useURIValidationHack:
我们来看一下 tomcat 中的一段源码:
【security】
if (connector.getUseURIValidationHack()) {
String uri = validate(request.getRequestURI());
if (uri == null) {
res.setStatus(400);
res.setMessage(“Invalid URI”);
throw new IOException(“Invalid URI”);
} else {
req.requestURI().setString(uri);
// Redoing the URI decoding
req.decodedURI().duplicate(req.requestURI());
req.getURLDecoder().convert(req.decodedURI(), true);
可以看到如果把 useURIValidationHack 设成”false”,可以减少它对一些 url
的不必要的检查从而减省开销。
enableLookups=”false” : 为了消除 DNS 查询对性能的影响我们可以关闭
DNS 查询,方式是修改 server.xml 文件中的 enableLookups 参数值。
disableUploadTimeout :类似于 Apache 中的 keeyalive 一样
给 Tomcat 配置 gzip 压缩(HTTP 压缩)功能
compression=”on” compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/JavaScript,text/css,text/plain”
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页
后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解
压缩并浏览。相对于普通的浏览过程 HTML,CSS,javascript , Text ,它可以节
省 40%左右的流量。更为重要的是,它可以对动态生成的,包括 CGI、PHP ,
JSP , ASP , Servlet,SHTML 等输出的网页也能进行压缩,压缩效率惊人。
1)compression=”on” 打开压缩功能
2)compressionMinSize=”2048″ 启用压缩的输出内容大小,这里面默认为
2KB
3)noCompressionUserAgents=”gozilla, traviata” 对于以下的浏览器,不启
用压缩
4)compressableMimeType=”text/html,text/xml” 压缩类型
最后不要忘了把 8443 端口的地方也加上同样的配置,因为如果我们走 https 协
议的话,我们将会用到 8443 端口这个段的配置,对吧?
<!–enable tomcat ssl–>
<Connector port=”8443″ protocol=”HTTP/1.1″
URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”
75″
enableLookups=”false” disableUploadTimeout=”true”
connectionTimeout=”20000″
acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″
minProcessors=”5″
useURIValidationHack=”false”
compression=”on” compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
SSLEnabled=”true”
scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS”
keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”
/>
好了,所有的 Tomcat 优化的地方都加上了。

6. 内存调优

内存方式的设置是在 catalina.sh 中,调整一下 JAVA_OPTS 变量即可,因为后

面的启动参数会把 JAVA_OPTS 作为 JVM 的启动参数来处理。
具体设置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -
XX:NewRatio=4 -XX:SurvivorRatio=4"
其各项参数如下:
-Xmx3550m:设置 JVM 最大可用内存为 3550M。
-Xms3550m:设置 JVM 促使内存为 3550m。此值可以设置与-Xmx 相同,以
避免每次垃圾回收完成后 JVM 重新分配内存。
-Xmn2g:设置年轻代大小为 2G。整个堆大小=年轻代大小 + 年老代大小 +
持久代大小。持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老
代大小。此值对系统性能影响较大,Sun 官方推荐配置为整个堆的 3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0 以后每个线程堆栈大小为 1M,
以前每个线程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相
同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的
线程数还是有限制的,不能无限生成,经验值在 3000~5000 左右。
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与年老代的比
值(除去持久代)。设置为 4,则年轻代与年老代所占比值为 1:4,年轻代占
整个堆栈的 1/5
-XX:SurvivorRatio=4:设置年轻代中 Eden 区与 Survivor 区的大小比值。设置
为 4,则两个 Survivor 区与一个 Eden 区的比值为 2:4,一个 Survivor 区占整
个年轻代的 1/6
-XX:MaxPermSize=16m:设置持久代大小为 16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为 0 的话,则年
轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可
以提高效率。如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进
行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收
的概论。

7. 垃圾回收策略调优

垃圾回收的设置也是在 catalina.sh 中,调整 JAVA_OPTS 变量。

具体设置如下:
JAVA_OPTS="$JAVA_OPTS -Xmx3550m -Xms3550m -Xss128k -
XX:+UseParallelGC -XX:MaxGCPauseMillis=100"
具体的垃圾回收策略及相应策略的各项参数如下:
串行收集器(JDK1.5 以前主要的回收方式)
-XX:+UseSerialGC:设置串行收集器
并行收集器(吞吐量优先)
示例:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -
XX:MaxGCPauseMillis=100
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有
效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程
一起进行垃圾回收。此值最好配置与处理器数目相等。
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0 支持
对年老代并行收集
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法
满足此时间,JVM 会自动调整年轻代大小,以满足此值。
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代
区大小和相应的 Survivor 区比例,以达到目标系统规定的最低相应时间或者收
集频率等,此值建议使用并行收集器时,一直打开。
并发收集器(响应时间优先)
示例:java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -
XX:+UseConcMarkSweepGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以
后,-XX:NewRatio=4 的配置失效了,原因不明。所以,此时年轻代大小最好
用-Xmn 设置。
-XX:+UseParNewGC: 设置年轻代为并行收集。可与 CMS 收集同时使用。
JDK5.0 以上,JVM 会根据系统配置自行设置,所以无需再设置此值。
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压
缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值
设置运行多少次 GC 以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性
能,但是可以消除碎片

8. 共享 session 处理

目前的处理方式有如下几种:

1).使用 Tomcat 本身的 Session 复制功能
参考 http://ajita.iteye.com/blog/1715312(Session 复制的配置)
方案的有点是配置简单,缺点是当集群数量较多时,Session 复制的时间会比
较长,影响响应的效率
2).使用第三方来存放共享 Session
目前用的较多的是使用 memcached 来管理共享 Session,借助于
memcached-sesson-manager 来进行 Tomcat 的 Session 管理
参考 http://ajita.iteye.com/blog/1716320(使用 MSM 管理 Tomcat 集群
session)
3).使用黏性 session 的策略
对于会话要求不太强(不涉及到计费,失败了允许重新请求下等)的场合,同
一个用户的 session 可以由 nginx 或者 apache 交给同一个 Tomcat 来处理,这
就是所谓的 session sticky 策略,目前应用也比较多
参考:http://ajita.iteye.com/blog/1848665(tomcat session sticky)
nginx 默认不包含 session sticky 模块,需要重新编译才行(windows 下我也不
知道怎么重新编译)
优点是处理效率高多了,缺点是强会话要求的场合不合适

9. 添加 JMS 远程监控

对于部署在局域网内其它机器上的 Tomcat,可以打开 JMX 监控端口,局域网

其它机器就可以通过这个端口查看一些常用的参数(但一些比较复杂的功能不
支持),同样是在 JVM 启动参数中配置即可,配置如下:
-Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=192.168.71.38 设置 JVM 的 JMS 监控监听的 IP
地址,主要是为了防止错误的监听成 127.0.0.1 这个内网地址
-Dcom.sun.management.jmxremote.port=1090 设置 JVM 的 JMS 监控的端口
-Dcom.sun.management.jmxremote.ssl=false 设置 JVM 的 JMS 监控不实用
SSL
-Dcom.sun.management.jmxremote.authenticate=false 设置 JVM 的 JMS 监
控不需要认证

10. 专业点的分析工具有

IBM ISA,JProfiler、probe 等,具体监控及分析方式去网上搜索即可

11. 关于 Tomcat 的 的 session 数目

这个可以直接从 Tomcat 的 web 管理界面去查看即可 ;

或者借助于第三方工具 Lambda Probe 来查看,它相对于 Tomcat 自带的管理
稍微多了点功能,但也不多 ;

12. 监视 Tomcat 的内存使用情况

使用 JDK 自带的 jconsole 可以比较明了的看到内存的使用情况,线程的状态,

当前加载的类的总量等;
JDK 自带的 jvisualvm 可以下载插件(如 GC 等),可以查看更丰富的信息。
如果是分析本地的 Tomcat 的话,还可以进行内存抽样等,检查每个类的使用
情况

13. 打印类的加载情况及对象的回收情况

这个可以通过配置 JVM 的启动参数,打印这些信息(到屏幕(默认也会到

catalina.log 中)或者文件),具体参数如下:
-XX:+PrintGC:输出形式:[GC 118250K->113543K(130112K), 0.0094143
secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails:输出形式:[GC [DefNew: 8614K->781K(9088K),
0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC
[DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured:
112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K),
0.0436268 secs]
-XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps 可与上面两个
混合使用,输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960
secs]
-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断
的执行时间。可与上面混合使用。输出形式:Application time: 0.5291524
seconds
-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。
可与上面混合使用。输出形式:Total time for which application threads were
stopped: 0.0468229 seconds
-XX:PrintHeapAtGC: 打印 GC 前后的详细堆栈信息
-Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析
-verbose:class 监视加载的类的情况
-verbose:gc 在虚拟机发生内存回收时在输出设备显示信息
-verbose:jni 输出 native 方法调用的相关情况,一般用于诊断 jni 调用错误信息

14. Tomcat 一个请求的完整过程

Ng:(nginx)

upstream yy_001{
server 10.99.99.99:8080;
server 10.99.99.100:8080;
hash $**;
healthcheck_enabled;
healthcheck_delay 3000;
healthcheck_timeout 1000;
healthcheck_failcount 2;
healthcheck_send ‘GET /healthcheck.html HTTP/1.0’ ‘Host: wo.com’
‘Connection: close’;
}
server {
include base.conf;
server_name wo.de.tian;
location /yy/ {
proxy_pass http://yy_001;
}
首先 dns 解析 wo.de.tian 机器,一般是 ng 服务器 ip 地址
然后 ng 根据 server 的配置,寻找路径为 yy/的机器列表,ip 和端口
最后 选择其中一台机器进行访问—->下面为详细过程

请求被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/1.1

Connector 获得
Connector 把该请求交给它所在的 Service 的 Engine 来处理,并等待来自
Engine 的回应
Engine 获得请求 localhost/yy/index.jsp,匹配它所拥有的所有虚拟主机 Host
Engine 匹配到名为 localhost 的 Host(即使匹配不到也把请求交给该 Host
处理,因为该 Host 被定义为该 Engine 的默认主机)
localhost Host 获得请求/yy/index.jsp,匹配它所拥有的所有 Context
Host 匹配到路径为/yy 的 Context(如果匹配不到就把该请求交给路径名
为”“的 Context 去处理)
path=”/yy”的 Context 获得请求/index.jsp,在它的 mapping table 中寻找
对应的 servlet
Context 匹配到 URL PATTERN 为*.jsp 的 servlet,对应于 JspServlet 类
构造 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用
JspServlet 的 doGet 或 doPost 方法
10)Context 把执行完了之后的 HttpServletResponse 对象返回给 Host
11)Host 把 HttpServletResponse 对象返回给 Engine
12)Engine 把 HttpServletResponse 对象返回给 Connector
13)Connector 把 HttpServletResponse 对象返回给客户 browser
14.Tomcat 工作模式?
Tomcat 是一个 JSP/Servlet 容器。其作为 Servlet 容器,有三种工作模式:独
立的 Servlet 容器、进程内的 Servlet 容器和进程外的 Servlet 容器。
进入 Tomcat 的请求可以根据 Tomcat 的工作模式分为如下两类:
Tomcat 作为应用程序服务器:请求来自于前端的 web 服务器,这可能是
Apache, IIS, Nginx 等;
Tomcat 作为独立服务器:请求来自于 web 浏览器;

Mysql

1. 数据库三范式是什么?

第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系

统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足
第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每
个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储
各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三
范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关
键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个
值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含
的非主关键字信息。

2. 有哪些数据库优化方面的经验?

用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql

发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,
那在设计数据库时就去掉外键。
表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结
果集中不包含重复数据且不需要排序时的话,那么就使用 UNION
ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一
个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处
理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除
重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排
序;UNION ALL 只是简单的将两个结果合并后就返回。

3. 请简述常用的索引有哪些种类?

普通索引: 即针对数据库表创建索引

唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值
必须唯一,但允许有空值
主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的
时候同时创建主键索引
组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。
即将数据库表中的多个字段联合起来作为一个组合索引。

4. 以及在 mysql 数据库中索引的工作机制是什么?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更

新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

5. MySQL 的基础操作命令:

MySQL 是否处于运行状态:Debian 上运行命令 service mysql

status,在 RedHat 上运行命令 service mysqld status
开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服
务;运行命令 service mysqld stop 停止服务
Shell 登入 MySQL: 运行命令 mysql -u root -p
列出所有数据库:运行命令 show databases;
切换到某个数据库并在上面工作:运行命令 use databasename; 进入
名为 databasename 的数据库
列出某个数据库内所有表: show tables;
获取表内所有 Field 对象的名称和类型 :describe table_name;

6. mysql 的复制原理以及流程。

Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据

分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据
复制到其它主机(slaves)上,并重新执行一遍来实现的。 * 复制过程中一
个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将
更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志
可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主
服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生
的任何更新,然后封锁并等待主服务器通知新的更新。 过程如下 1. 主服务器
把更新记录到二进制日志文件中。 2. 从服务器把主服务器的二进制日志拷贝
到自己的中继日志(replay log)中。 3. 从服务器重做中继日志中的时间,
把更新应用到自己的数据库上。

7.mysql 支持的复制类型?

基于语句的复制: 在主服务器上执行的 SQL 语句,在从服务器上执行

同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 一旦发
现没法精确复制时,会自动选着基于行的复制。
基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执
行一遍. 从 mysql5.0 开始支持
混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法
精确的复制时,就会采用基于行的复制。

8.mysql 中 中 myisam 与 与 innodb 的区别?

事务支持 > MyISAM :强调的是性能,每次查询具有原子性 , 其执行数

度比 InnoDB 类型更快,但是不提供事务支持。 > InnoDB:提供事
务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚
(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全
(transaction-safe (ACID compliant))型表。
InnoDB 支持行级锁,而 MyISAM 支持表级锁. >> 用户在操作
myisam 表时,select,update,delete,insert 语句都会给表自动
加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插
入新的数据。
InnoDB 支持 MVCC, 而 MyISAM 不支持
InnoDB 支持外键,而 MyISAM 不支持
表主键 > MyISAM :允许没有任何索引和主键的表存在,索引都是保
存行的地址。 > InnoDB:如果没有设定主键或者非空唯一索引,就会
自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附
加索引保存的是主索引的值。
InnoDB 不支持全文索引,而 MyISAM 支持。
可移植性、备份及恢复 > MyISAM :数据是以文件的形式存储,所以
在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进
行操作。 > InnoDB:免费的方案可以是拷贝数据文件、备份
binlog,或者用 mysqldump,在数据量达到几十 G 的时候就相对痛
苦了
存储结构 > MyISAM :每个 MyISAM 在磁盘上存储成三个文件。第一
个文件的名字以表的名字开始,扩展名指出文件类型。 .frm 文件存储表
定义。数据文件的扩展名为 .MYD (MYData) 。索引文件的扩展名
是 .MYI (MYIndex) 。 > InnoDB:所有的表都保存在同一个数据文件
中(也可能是多个文件,或者是独立的表空间文件),InnoDB 表的大
小只受限于操作系统文件的大小,一般为 2GB。

9.mysql 中 中 varchar 与 与 char 的区别以及 varchar(50) 中的 50 代表的涵 义?

varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是

一种可变长度的类型.
varchar(50)中 50 的涵义 : 最多存放 50 个字节
int(20)中 20 的涵义: int(M)中的 M indicates the maximum
display width (最大显示宽度)for integer types. The maximum
legal display width is 255.

10.MySQL 中 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区 别?

Read Uncommitted(读取未提交内容) >> 在该隔离级别,所有事

务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应
用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称
之为脏读(Dirty Read)。
Read Committed(读取提交内容) >> 这是大多数数据库系统的默
认隔离级别(但不是 MySQL 默认的)。它满足了隔离的简单定义:一
个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的
不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该
实例处理其间可能会有新的 commit,所以同一 select 可能返回不同结
果。
Repeatable Read(可重读) >> 这是 MySQL 的默认事务隔离级
别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据
行。不过理论上,这会导致另一个棘手的问题:幻读(Phantom
Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事
务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现
有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通过多版本并发控制
(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了
该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也
就是它这里所谓的并发控制)才解决了幻读问题。
Serializable(可串行化) >> 这是最高的隔离级别,它通过强制事务
排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个
读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁
竞争。

11. 表中有大字段 X (例如:text 类型),且字段 X 不会经常更新,以读为 为主,将该字段拆成子表好处是什么?

如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这

时候放在一起就变成缺点了。 MYSQL 数据库的记录存储是按行存储的,数据
块大小又是固定的(16K),每条记录越小,相同的块存储的记录就越多。此
时应该把大字段拆走,这样应付大部分小字段的查询时,就能提高效率。当需
要查询大字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后,
对字段的 UPDAE 就要 UPDATE 多个表了

12.MySQL 中 中 InnoDB 引擎的行锁是通过加在什么上完成(或称实现)

的?

InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与
Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这
种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级
锁,否则,InnoDB 将使用表锁!

13.MySQL 中控制内存分配的全局参数,有哪些?

  1. Keybuffersize: > * keybuffersize 指定索引缓冲区的大小,

    它决定索引处理的速度,尤其是索引读的速度。通过检查状态值
    Keyreadrequests 和 Keyreads ,可以知道 keybuffersize 设置是否
    合理。比例 keyreads /keyreadrequests 应该尽可能的低,至少是
    1:100,1:1000 更好(上述状态值可以使用 SHOW STATUS LIKE
    ‘keyread%’ 获得)。 > * keybuffersize 只对 MyISAM 表起作用。
    即使你不使用 MyISAM 表,但是内部的临时磁盘表是 MyISAM 表,也
    要使用该值。可以使用检查状态值 createdtmpdisktables 得知详情。
    对于 1G 内存的机器,如果不使用 MyISAM 表,推荐值是 16M(8-
    64M) > * keybuffersize 设置注意事项 >>>1. 单个 keybuffer 的
    大小不能超过 4G ,如果设置超过 4G ,就有可能遇到下面 3 个
    bug: >>>>>
    ->>>>>
    ->>>>>
    ->>>2. 建议 keybuffer 设置为物理内存的 1/4(针对 MyISAM 引
    擎),甚至是物理内存的 30%~40%,如果 keybuffersize 设置太大,
    系统就会频繁的换页,降低系统性能。因为 MySQL 使用操作系统的缓
    存来缓存数据,所以我们得为系统留够足够的内存;在很多情况下数据
    要比索引大得多。 >>>3. 如果机器性能优越,可以设置多个
    keybuffer, 分别让不同的 keybuffer 来缓存专门的索引

  2. innodbbufferpool_size > 表示缓冲池字节大小, InnoDB 缓存

    表和索引数据的内存区域。 mysql 默认的值是 128M 。最大值与你的
    CPU 体系结构有关,在 32 位操作系统,最大值是 4294967295
    (2^32-1) ,在 64 位操作系统,最大值为
    18446744073709551615 (2^64-1) 。 > 在 32 位操作系统中,
    CPU 和操作系统实用的最大大小低于设置的最大值。如果设定的缓冲池
    的大小大于 1G,设置 innodbbufferpoolinstances 的值大于 1. > *
    数据读写在内存中非常快 , innodbbufferpoolsize 减少了对磁盘的读
    写。 当数据提交或满足检查点条件后才一次性将内存数据刷新到磁盘
    中。然而内存还有操作系统或数据库其他进程使用, 一般设置 buffer
    pool 大小为总内存的 3/4 至 4/5。 若设置不当, 内存使用可能浪费
    或者使用过多。 对于繁忙的服务器, buffer pool 将划分为多个实例以
    提高系统并发性, 减少线程间读写缓存的争用。buffer pool 的大小首
    先受 innodbbufferpool_instances 影响, 当然影响较小。

  3. querycachesize > 当 mysql 接收到一条 select 类型的 query

    时, mysql 会对这条 query 进行 hash 计算而得到一个 hash 值,然后
    通过该 hash 值到 query cache 中去匹配,如果没有匹配中,则将这个
    hash 值存放在一个 hash 链表中,同时将 query 的结果集存放进
    cache 中,存放 hash 值的链表的每一个 hash 节点存放了相应 query
    结果集在 cache 中的地址,以及该 query 所涉及到的一些 table 的相
    关信息;如果通过 hash 值匹配到了一样的 query ,则直接将 cache 中
    相应的 query 结果集返回给客户端。如果 mysql 任何一个表中的任何
    一条数据发生了变化,便会通知 query cache 需要与该 table 相关的
    query 的 cache 全部失效,并释放占用的内存地址。 > query cache
    优缺点 >> 1. query 语句的 hash 计算和 hash 查找带来的资源消
    耗。mysql 会对每条接收到的 select 类型的 query 进行 hash 计算然
    后查找该 query 的 cache 是否存在,虽然 hash 计算和查找的效率已
    经足够高了,一条 query 所带来的消耗可以忽略,但一旦涉及到高并
    发,有成千上万条 query 时,hash 计算和查找所带来的开销就的重视
    了; >> 2. query cache 的失效问题。如果表变更比较频繁,则会造
    成 query cache 的失效率非常高。表变更不仅仅指表中的数据发生变
    化,还包括结构或者索引的任何变化; >> 3. 对于不同 sql 但同一结
    果集的 query 都会被缓存,这样便会造成内存资源的过渡消耗。sql 的
    字符大小写、空格或者注释的不同,缓存都是认为是不同的 sql(因为
    他们的 hash 值会不同); >> 4. 相关参数设置不合理会造成大量内
    存碎片,相关的参数设置会稍后介绍。

  4. readbuffersize >是 MySQL 读入缓冲区大小。对表进行顺序扫描

    的请求将分配一个读入缓冲区,MySQL 会为它分配一段内存缓冲区。
    readbuffersize 变量控制这一缓冲区的大小。如果对表的顺序扫描请求
    非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以
    及内存缓冲区大小提高其性能。

14. 若一张表中只有一个字段 VARCHAR(N) 类型,utf8 编码,则 N 最大值 为多少( 精确到数量级即可)?

由于 utf8 的每个字符最多占用 3 个字节。而 MySQL 定义行的长度不能超过

65535,因此 N 的最大值计算方法为:(65535-1-2)/3。减去 1 的原因是实
际存储从第二个字节开始,减去 2 的原因是因为要在列表长度存储实际的字符
长度,除以 3 是因为 utf8 限制:每个字符最多占用 3 个字节。

15. [SELECT *] 和[SELECT 全部字段]的 的 2 种写法有何优缺点?

前者要解析数据字典,后者不需要

结果输出顺序,前者与建表列顺序相同,后者按指定字段顺序。
表字段改名,前者不需要修改,后者需要改
后者可以建立索引进行优化,前者无法优化
后者的可读性比前者要高

16.HAVNG 子句 和 WHERE 的异同点?

语法上:where 用表中列名,having 用 select 结果别名

影响结果范围:where 从表读出数据的行数,having 返回客户端的行
索引:where 可以使用索引,having 不能使用索引,只能在临时结果
集操作
where 后面不能使用聚集函数,having 是专门使用聚集函数的。

17.MySQL 当记录不存在时 insert, 当记录存在时 update ,语句怎么写?

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY

UPDATE c=c+1;

18.MySQL 的 的 insert 和 和 update 的 的 select 语句语法

SQL insert into student (stuid,stuname,deptid) select 10,‘xzm’,3 from student where stuid > 8; update student a inner join student b on b.stuID=10 set a.stuname=concat(b.stuname, b.stuID) where a.stuID=10 ;

转载地址:https://blog.csdn.net/weixin_45067120/article/details/105335115 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如何使用BigDecimal(最好关于钱用)在java增加数据
下一篇:初级程序员Mysql最新安装步骤(安装,卸载,常见问题)

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月26日 09时27分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

大数据_Hbase-内容回顾和补充---Hbase工作笔记0018 2019-04-26
大数据_Hbase-内容回顾_知识点补充_线程安全与wait的区别---Hbase工作笔记0019 2019-04-26
大数据_Hbase-Filter & 索引(优化)_根据column查询---Hbase工作笔记0020 2019-04-26
大数据_MapperReduce_从CSV文件中读取数据到Hbase_自己动手实现Mapper和Reducer---Hbase工作笔记0021 2019-04-26
大数据_MapperReduce_协处理器_类似Mysql的触发器---Hbase工作笔记0024 2019-04-26
大数据_MapperReduce_Hbase的优化_存数据_自动计算分区号 & 自动计算分区键---Hbase工作笔记0027 2019-04-26
大数据_MapperReduce_Hbase的优化_RowKey设计原则---Hbase工作笔记0028 2019-04-26
大数据_MapperReduce_Hbase的优化和Hbase相关面试题_以及hbase的javaapi的一部分源码---Hbase工作笔记0029 2019-04-26
大数据_MapperReduce_Hbase配置参数说明_以及部分源码说明---Hbase工作笔记0031 2019-04-26
Vue介绍---vue工作笔记0001 2019-04-26
Vue基本使用---vue工作笔记0002 2019-04-26
微信公众号介绍_以及注册订阅号---微信公众号开发工作笔记0001 2019-04-26
Vue模板语法---vue工作笔记0003 2019-04-26
Vue计算属性之基本使用---vue工作笔记0004 2019-04-26
Vue监视---vue工作笔记0005 2019-04-26
Vue条件渲染---vue工作笔记0008 2019-04-26
Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011 2019-04-26
Vue表单数据自动收集---vue工作笔记0012 2019-04-26
Vue生命周期---vue工作笔记0013 2019-04-26
ES6-ES11新特性_ECMAScript_简单介绍---JavaScript_ECMAScript工作笔记001 2019-04-26