2.性能优化

性能测试优化

1 优化方向

  1. 硬件问题(资源利用率使用—瓶颈—扩容);
  2. 网络问题(增加带宽);
  3. 应用服务器、数据库等配置问题(参数调优 如:jvm,max threads,max_connection,cache);
  4. 源代码、数据库脚本问题(是否存在不合理代码 调整算法 mysql是否存在慢查询是否利用索引);
  5. 系统架构问题(能否支持分布式集群)。

2.服务器架构

2.1 服务器架构概念

  • 服务器的英文名称为“ Server”,是指在网络上提供各种服务的高性能计算机。作为网络的节点,存储、处理网络上80%的数据、信息,因此也被称为网络的灵魂。
  • 服务器和普通计算机的功能是类似的。只是相对于普通计算机,服务器在稳定性、安全性、性能等方面都要求更高,因此CPU、芯片组、内存、磁盘系统、网络等硬件和普通计算机有所不同。
  • 具体来说,服务器与普通计算机的主要区别包括:
    • 通信方式为一对多:PC、平板、手机等固定或移动的网络终端,上网、获取资讯、与外界沟通、娱乐等,必然要经过服务器,服务器通过“一对多”来组织和领导这些设备。
    • 资源通过网络共享:服务器通过侦听网络上其它终端(Client)提交的服务请求,在网络操作系统的控制下,将与其相连的硬盘、打印机、Modem及各种专用通讯设备提供给网络上的客户站点共享,也能为网络用户提供集中计算、信息发表及数据管理等服务。
    • 硬件性能更加强大:服务器的高性能主要体现在高速度的运算能力、长时间的可靠运行、强大的外部数据吞吐能力等方面。
    • 服务器厂商会根据不同的应用场景,对服务器进行差异化设计,目前主要的应用场景包括文件交互、数据存储和查询、应用程序应答与运行等。

2.2 服务器架构演变

  • 单体应用架构

    • 一个典型的单体架构就是将所有的业务场景的表现层,业务逻辑层,数据访问层放在一个工程中最终经过编译,打包,部署在一台服务器上
    • image-20211012115929308
  • 集群架构(分布式)

    • 应用服务器集群(多台服务器处理 负载均衡)
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCJ48abU-1670222907611)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20211012120025.png)]
  • 微服务架构

    • image-20211012120101667

    • 微服务优缺点:
      微服务架构模式有很多好处。
      第一,通过分解巨大单体应用为多个服务方法解决了复杂性问题。
      在功能不变的情况下,应用被分解为多个可管理的分支或服务。每个服务都有一个用 RPC- 或者消息驱动 API 定义清楚的边界。
      第二,这种架构使得每个服务都可以有专门开发团队来开发。
      开发者可以自由选择开发技术,提供 API 服务。
      第三,微服务架构模式使得每个微服务独立部署,开发者不再需要协调其它服务部署对本服务的影响。
      最后,微服务架构模式使得每个服务独立扩展。你可以根据每个服务的规模来部署满足需求的实利。
      微服务架构也有不足。
      其中一个跟他的名字类似,“微服务”强调了服务大小,实际上,有一些开发者鼓吹建立稍微大一些的,10-100 LOC服务组。尽管小服务更乐于被采用,但是不要忘了微服务只是结果,而不是最终目的。微服务的目的是有效的拆分应用,实现敏捷开发和部署。
      另外一个不足之处在于,微服务应用是分布式系统,由此会带来固有的复杂性。开发者需要在 RPC 或者消息传递之间选择并完成进程间通讯机制。此外,他们必须写代码来处理消息传递中速度过慢或者不可用等局部失效问题。
      另外一个关于微服务的挑战来自于分区的数据库架构。同时更新多个业务主体的事务很普遍。这种事务对于单体式应用来说很容易,因为只有一个数据库。在微服务架构应用中,需要更新不同服务所使用的不同的数据库。
      测试一个基于微服务架构的应用也是很复杂的任务。另外一个挑战在于,微服务架构模式应用的改变将会波及多个服务。部署一个微服务应用也很复杂,一个单体应用只需要在复杂均衡器后面部署各自的服务器就好了。每个应用实例是需要配置诸如数据库和消息中间件等基础服务。每个服务都有多个实例,这就形成大量需要配置、部署、扩展和监控的部分。除此之外,你还需要完成一个服务发现机制(后续文章中发表),以用来发现与它通讯服务的地址(包括服务器地址和端口)
      

3.性能优化实施

3.1 部署集群环境

1. 为什么需要服务器集群

随着网站访问量的日益增大,传统的单一web 应用实例部署方式,已完全无法满足高并发的需求,性能出现瓶颈。这个时候我们如何去优化我们的项目。第一个点就是提高我们的硬件。但是硬件也有瓶颈。所以我们还得知道集群化部署。集群部署即一个应用多个实例部署,通过负载均衡将客户端高并发请求分散到集群部署的多个实例中去,实例处理完客户端请求,将结果再返回给客户端;集群部署的服务器对外提供统一的访问接口,后端的部署对于用户来说是没啥感觉的。随着访问量的不断增大我们还可以灵活的增加实例的部署数量;

总结而言就是单台服务器部署一个项目,当用户量大的时候,可能存在性能瓶颈。所以我们需要多台服务器来处理我们的用户请求。

2. 什么是服务器集群

简单明了的说就是多台服务器部署同一个实例,共同协作处理用户请求

优势:

  • 强扩展能力 —— 采用集群技术的集群系统则可以扩展到成百上千个服务器(横向拓展)
    • 横向扩展 也叫 水平扩展,用更多的节点支撑更大量的请求。 如成千上万的蚂蚁完成一项搬运工作
    • 纵向扩展 又叫 垂直扩展,扩展一个点的能力支撑更大的请求。如提高1个人的能力完成某些工作,
  • 实现方式容易 —— 服务器集群技术相对其他扩展技术来说更加容易实现,主要是通过软件进行的。在硬件上可以把多台性能较低、价格便宜的服务器,通过集群服务集中连接在一起即可实现整个服务器系统成倍,甚至几十、几百倍地增长。无论是从软硬件构成成本上来看,还是从技术实现成本上来看都较其他扩展方式低。
  • 高可用性 —— 使用集群服务拥有整个集群系统资源的所有权。如磁盘驱动器和IP地址将自动地从有故障的服务器上转移到可用的服务器上。当集群中的系统或应用程序出现故障时,集群软件将在可用的服务器上,重启失效的应用程序,或将失效节点上的工作分配到剩余的节点上。在切换过程中,用户只是觉得服务暂时停顿了一下。、
    • 负载均衡
    • 故障转移
  • 易管理性 —— 可以使用集群管理器来管理集群系统的所有服务器资源和应用程序。同时,还可以从网络的任意地方的节点和资源处,监视集群的状态。当失效的服务器连回来时,将自动返回工作状态,集群技术将自动在集群中平衡负荷,而不需要入工干预。
3. 部署集群环境
1. Nginx + Tomcat部署集群
  1. https://www.cnblogs.com/bluestorm/p/4574688.html

  2. 安装相关依赖

  3. yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
    
  4. 上传nginx包 到/usr/local/src下解压

    先上传到 /usr/local/srccd   /usr/local/src tar -zxvf nginx-1.20.1.tar.gz
    
  5. cd /usr/local/src/nginx-1.20.1/

  6. ./configure --prefix=/usr/local/nginx-1.20 --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module 
    常用编译选项说明
    nginx大部分常用模块,编译时./configure --help以--without开头的都默认安装。
    --prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
    --conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
    --user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似
    --with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
    --with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
    --with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
    --with-http_stub_status_module : 用来监控 Nginx 的当前状态
    --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
    --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)
    
  7. 编译 
    make && make install
    创建软连接 相当于提供快捷键
    ln -s 源文件  连接文件
    ln -s  /usr/local/nginx-1.20/sbin/nginx /usr/bin/nginx
    
  8. nginx -t 检测是否安装成功[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WuGvthp6-1670222907612)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722112115.png)]

  9. 或者,在浏览器地址输入IP地址回车出现如下页面,则表示安装成功image-20210722112143444

  10. nginx相关命令

  11. 启动服务:nginx
    退出服务:nginx -s quit
    强制关闭服务:nginx -s stop
    重载服务:nginx -s reload  (重载服务配置文件,类似于重启,但服务不会中止)
    验证配置文件:nginx -t
    使用配置文件:nginx -c "配置文件路径"
    使用帮助:nginx -h
    
  12. nginx.conf中相关参数 https://blog.csdn.net/qq_33454884/article/details/89212702

  13. 我们要做的只需要准备2个tomcat环境部署;不同的服务器上各自准备1个;nginx放置其中一方部署

  14. 配置nginx参数

    • 端口占用:默认80端口,需要修改nginx.conf文件中的listen 80;防止端口占用[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OA17IOyC-1670222907613)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722115638.png)]
    • 配置集群服务器的负载均衡及权重信息image-20210722115921251
    • 配置配置路由访问信息[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNGLrslU-1670222907615)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722121229.png)]
  15. 补充:

    • 同一台电脑配置多个tomcat https://blog.csdn.net/xiamoyanyulrq/article/details/82708950
    • 启动tomcat服务 及nginx服务 然后访问nginx端口
    • 查看端口占用 及进程杀除image-20210720105926435

3.2 Web 服务器与应用服务器的区别是什么?(动静分离)

严格意义上Web服务器只负责处理HTTP协议,只能发送静态页面的内容。而JSP,ASP,PHP等动态内容需要通过CGI、FastCGI、ISAPI等接口交给其他程序去处理。这个其他程序就是应用服务器。
比如Web服务器包括Nginx,Apache,IIS等。而应用服务器包括WebLogic,JBoss等。应用服务器一般也支持HTTP协议,因此界限没这么清晰。但是应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化,所以s很少有见Tomcat直接暴露给外面,而是和Nginx、Apache等配合,只让Tomcat处理JSP和Servlet部分

不太严谨的说法:
web服务器就是负责接收用户的Request,然后响应html等给客户浏览器。
应用服务器处理一些业务逻辑等。

简而言之,应用服务器处理业务逻辑,web服务器则主要是让客户可以通过浏览器进行访问,处理HTML文件,web服务器通常比应用服务器简单。

3.3 JVM基础及参数调整

2.3.1 JVM相关概念

什么是JVM

JDK(java development kit)
JDK是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。
JRE(java runtime environment)
JRE是Java的运行环境,包括JVM标准实现及Java核心类库。
JVM(java virtual machine)
JVM是java虚拟机,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rh2ti80W-1670222907617)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722165852.png)]

堆和栈

栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿

从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开使得处理逻辑更为清晰,体现了分而治之的思想。堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。面向对象就是堆和栈的完美结合,当把对象拆开会发现对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。

2.3.2 垃圾回收机制

通俗易懂的垃圾回收 https://blog.csdn.net/qq_35031177/article/details/64127025

垃圾回收(GC)的作用

在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。垃圾回收 。垃圾回收意味着程序不再需要的对象是”无用信息”,这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾回收也可以清除内存记录碎片,碎片是分配给对象的内存块之间的空闲内存洞,碎片整理将所占用的堆内存移到堆的一端,JVM将整理出的内存分配给新的对象。

2.3.3 jvm调优工具
  1. 运行tomcat应用服务器;
  2. 在jdk的bin目录下,找到jvisualvm.exe文件,运行,打开界面如图所示image-20210722172143785
  3. 点击tomcat 点击【监视】页签,可以看到CPU、堆栈、类和线程的运行情况:
  4. 点击【线程】页签,可以观察到每一个线程的具体信息和运行情况:
  5. 如果要进行更加具体的分析,需要给该工具添加插件;jvisualvm 的插件安装,选择【工具】——【插件】——【可用插件】,如果没有检测到可用插件:
  6. 是因为java.net网站已经被Oracle关闭了,visualvm已经迁移到了github上,地址是https://visualvm.github.io/pluginscenters.html,根据不同的jdk版本找到对应的插件地址:
  7. 找到【工具】——【插件】——【设置】,将现有的地址更改为刚才找到的地址,修改完成后更新安装可用插件,然后重启JVisualVM:
2.3.4 tomcat监控

在了解了JVM基本原理之后,接下来对应用服务器tomcat进行配置和优化。

  1. 在 tomcathome/conf/Catalina/localhost/下创建 manager.xml , 填入如下内容:

  2. <Context privileged="true" antiResourceLocking="false" 
             docBase="${catalina.home}/webapps/manager">
        <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
    </Context>
    
  3. 打开tomcat所在目录,找到conf目录下的tomcat-users.xml文件,使用文本编辑工具打开,找到节点,添加相关的用户及权限

  4. <role rolename="manager"/>
        <role rolename="manager-status"/>
      <role rolename="manager-gui"/>
      <user username="admin" password="123456" roles="manager,manager-status,manager-gui"/>
    
  5. 保存后启动tomcat,在windows下启动bin目录下的startup.bat,在linux下运行startup.sh,在浏览器地址栏内输入http://localhost:8080,打开tomcat初始页面:

  6. 点击右侧的Server Status,输入配置好的账号密码,进入tomcat管理页面:

  7. 在该页面上可以查看到tomcat监控到的内存状态和线程情况,如上图第一行包括的内容有:

    Free Memory(剩余内存 )、Total Memory(总计内存)和Max Memory(系统分配给Tomcat的最大可用内存) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zrLXInyK-1670222907618)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722191256.png)]

  8. 还可以查看当前的线程数 状态image-20210722191507275

2.3.5 tomcat参数调整
1.tomcat内存参数调整
  1. 打开bin目录下的catalina.bat(Linux是catalina.sh)文件,在该文件中可以手工添加内存参数的配置

  2. 如果是windows 输入

  3. set JAVA_OPTS=-Xms1024M -Xmx1024M
    
  4. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PKghh56A-1670222907619)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722192350.png)]

  5. 如果是Linux系统 image-20210723120842144 输入

  6. JAVA_OPTS="-Xms512M -Xmx1024M"
    
  7. tomcat常用配置和优化方法 https://www.cnblogs.com/xuwc/p/8523681.html

2. tomcat连接参数调整
  1. 打开conf目录下的server.xml文件,可以看到如下的节点:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEXGAcvF-1670222907620)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210722192500.png)]

  2. 我们还可以添加以下配置
    acceptCount="1000"  可接受的最大连接数;
    maxProcessors="1000"  最大活动线程数;
    port="8080"   服务端口;
    protocol="HTTP/1.1"   服务协议;
    connectionTimeout="20000"  超时时间,单位是ms;
    redirectPort="8443"  重定向端口,需要安全通信的场合,将把客户请求转发至SSL的redirectPort端口;
    maxThreads:Tomcat可创建的最大的线程数,每一个线程处理一个请求; maxThreads决定了tomcat的最大线程阀值,需要设置的大一些;
    minSpareThreads:最小备用线程数,tomcat启动时的初始化的线程数;
    maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程;
    URIEncoding="gbk"   设置tomcat默认的转码格式。
    其中和最大连接数相关的参数为maxThreads和acceptCount。两者的默认值分别是200和100,要调整Tomcat的默认最大连接数,可以增加这两个属性的值,但要注意,Web Werver允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右,所以maxThreads并不是越大越好。maxThreads 是处理请求的线程数,acceptCount 是等待队列,acceptCount并不是一定要大于等于maxThreads。maxThreads 满了,进入acceptCount,acceptCount也满了,则拒绝请求
    

    3.4 mysql优化

1. QUERY参数相关含义

image-20210720110243974

  • binlog_rows_query_log_events OFF

    • 开启该参数,将把sql语句打印到binlog日志里面.默认是0(off);虽然将语句放入了binlog,但不会执行这个sql,就相当于注释一样.但对于dba来说,在查看binlog的时候,很有用处.
  • ft_query_expansion_limit 20

    • 全文搜索特性,该参数主要是针对MyISAM存储引擎来说的。如果不使用FULLTEXT索引,就不需要优化。
    • InnoDB 与 MyISAM对比 https://zq.zhaopin.com/question/5193017
  • have_query_cache YES

    • 查询缓存 ,用于将执行过的 SELECT 语句和结果缓存在内存中。每次执行查询之前判断是否命中缓存,如果命中直接返回缓存的结果。缓存命中需要满足许多条件,SQL 语句完全相同,上下文环境相同等。实际上除非是只读应用,否则查询缓存的失效频率非常高,任何对表的修改( INSERT,

      UPDATE, DELETE, TRUNCATE, ALTER TABLE, DROP TABLE, or DROP DATABASE 等操作)都会导致之前的缓存会无效并且删除;一定程度上也会影响我们数据库的性能。因此,查询缓存功能在 MySQL 8.0 中已经被删除,have_query_cache 的值永远都是 NO,将来会被删除。

  • long_query_time 10.000000

    • 长查询的时间(用来过滤慢查询)
  • query_alloc_block_size 8192

    • 为查询分析和执行过程中创建的对象分配的内存块大小。如果内存分段过程中遇到问题,将该变量增加一位会有帮助
  • query_cache_limit 1048576

    • 不要缓存大于该值的结果。默认值是1048576(1MB)。
  • query_cache_min_res_unit 4096

    • 查询缓存分配的最小块的大小(字节)。 默认值是4096(4KB)。
  • query_cache_size 1048576

    • 为缓存查询结果分配的内存的数量。默认值是0,即禁用查询缓存。请注意即使query_cache_type设置为0也将分配此数量的内存。
  • query_cache_type OFF

    • 设置查询缓存类型。
    • | 选项 | 描述 |
      | ————- | —————————————————————————————— |
      | 0或OFF | 不要缓存或查询结果。请注意这样不会取消分配的查询缓存区。要想取消,你应将query_cache_size设置为0。 |
      | 1或ON | 缓存除了以SELECT SQL_NO_CACHE开头的所有查询结果。 |
      | 2或DEMAND | 只缓存以SELECT SQL_NO_CACHE开头的查询结果。 |
  • query_cache_wlock_invalidate OFF

    • 当客户端对MyISAM表进行WRITE锁定时,如果查询结果位于查询缓存中,则其它客户端未被锁定,可以对该表进行查询。将该变量设置为1,则可以对表进行WRITE锁定,使查询缓存内所有对该表进行的查询变得非法。这样当锁定生效时,可以强制其它试图访问表的客户端来等待
  • query_prealloc_size 8192

    • 用于查询分析和执行的固定缓冲区的大小。在查询之间该缓冲区不释放。如果你执行复杂查询,分配更大的query_prealloc_size值可以帮助提高性能,因为它可以降低查询过程中服务器分配内存的需求。
  • slow_query_log OFF 开启慢查询日志 默认关闭

    • https://www.jb51.net/article/124001.htm
    • https://baijiahao.baidu.com/s?id=1636831457692964699&wfr=spider&for=pc
  • slow_query_log_file D:\wamp64\bin\mysql\mysql5.7.24\data\DESKTOP-HPUC7CA-slow.log 慢查询日志保存路径

2. 修改 mysql 配置参数
方案1:修改配置文件

在my.ini(Linux 下文件名为 my.cnf 路径一般/etc/my.cof),查找到[mysqld]区段,修改对应的配置。

Windows如果是安装的官方版本直接去 服务中找到mysql 然后查看大他的可执行文件路径

如果是集成环境直接去集成环境下去搜索

注意:修改配置文件,需要重新启动数据库服务才会生效

方案2:命令行修改

注意:命令行修改配置方式不需要不重启即可生效,但重启之后会自动失效

3. mysql索引
  1. 什么是索引

数据库索引是一种数据结构,可以提高表中的查询速度

  1. 怎么创建索引
  • 命令行添加:create index index_name on tablename;
  • 数据库管理工具-添加

3.为什么需要索引?

  • 提高查询效率
  • https://zhuanlan.zhihu.com/p/52124916
  • 减少存储引擎需要扫描的数据量
  • 能够改善数据库的性能瓶颈问题,体现在服务端的磁盘IO的消耗
  • 减少使用临时表的概率
  • 将随机的IO转换成顺序的IO

4.优点和缺点

优点

1、所有的 MySql 列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

2、大大加快数据的查询速度

缺点

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们

有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据

的维护速度

4.mysql 慢查询
  1. 一条SQL语句的执行流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gENb0yXy-1670222907622)(https://woniumd.oss-cn-hangzhou.aliyuncs.com/test/zhangjing/20210723124301.png)]

5.sql 优化建议
  1. 避免大sql 一个SQL只能在一个cpu上运行,在高并发环境中,大SQL容易影响性能问题,可能一个大SQL会把数据库搞死,因此应该拆分SQL
  2. 无关操作踢出事务,减少资源占用;保持一致性的前提下,拆分事务
  3. 避免大批量更新,避开高峰
  4. 避免类型转换
  5. 避免取过量数据,建议使用limit
  6. 避免在SQL 语句中进行数学运算、函数计算、逻辑判断等操作
  7. 避免 SELECT *
  8. . 避免在 where 子句中使用!=或<>操作符
  9. 避免在 where 子句中对字段进行 null 值判断
  10. 尽量避免全表扫描
  11. 避免使用or,同一字段推荐in,不同字段,推荐union
  12. like 语句避免前置百分号
    一条SQL语句的执行流程

[外链图片转存中…(img-gENb0yXy-1670222907622)]

5.sql 优化建议
  1. 避免大sql 一个SQL只能在一个cpu上运行,在高并发环境中,大SQL容易影响性能问题,可能一个大SQL会把数据库搞死,因此应该拆分SQL
  2. 无关操作踢出事务,减少资源占用;保持一致性的前提下,拆分事务
  3. 避免大批量更新,避开高峰
  4. 避免类型转换
  5. 避免取过量数据,建议使用limit
  6. 避免在SQL 语句中进行数学运算、函数计算、逻辑判断等操作
  7. 避免 SELECT *
  8. . 避免在 where 子句中使用!=或<>操作符
  9. 避免在 where 子句中对字段进行 null 值判断
  10. 尽量避免全表扫描
  11. 避免使用or,同一字段推荐in,不同字段,推荐union
  12. like 语句避免前置百分号
  13. 优先优化高并发的 SQL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值