Java开发 - 如何进行慢sql优化

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java开发 - 如何进行慢sql优化

目录


前言

什么是慢sql

关于sql优化的杂谈

如何进行慢sql的优化

第一步,查询哪些sql语句属于慢sql

第二步,我们来看看有哪些sql可以用来操作慢sql

查看慢sql日志是否打开

开启慢sql日志功能

查询慢sql日志设置的超时时间

修改慢sql设置的超时时间

查看日志文件

注意事项

如何对sql进行优化

数据库优化

服务器宕机的解决办法

索引

结语


前言


上一篇中,我们已经详细的了解了数据库的基本数据结构,虽有遗漏,不过也会在近几篇中通过相关的知识点慢慢补齐。

上一篇,我们最后讲了数据库的隔离级别,那么mysql默认隔离级别为可重复读,是否会产生幻读?在表格中,我们已经给出了答案,不妨再来看看这张表:

隔离等级 产生脏读 产生不可重复读 产生幻读
读未提交 true true true
读已提交 false true true
可重复读 false false true
可串行化 false false false

解决幻读的方式是MVCC,关于MVCC,在上一篇中,我们通过大量的篇幅和表格进行了说明,理解了也就不那么难了,很像我们开发中写个if...else判断的感觉。


下面,我们就来说说怎么进行慢sql优化。


什么是慢sql


通俗的讲,慢sql就是我们写的sql语句执行的时间太长,导致前台等待的时间太久,影响了用户体验。任何产品都是以服务他人为前提,体验差了自然是要去查找原因并作出优化的。


执行时间超过10s,默认视为慢sql,会将该sql记录到日志文件中。


关于sql优化的杂谈


在我们的日常应用中,大多数接口在1s内算是合理的,个别接口3s内勉强能接受,当然,我们后期还会配合redis,es,session来做一些数据的缓存,以此来提高查询的效率。同时表的创建也是一个需要花时间推敲的东西,多表查询大家都知道,想象一下,若是五表连查,六表连查,是不是很要命,不说效率,光是要看懂都需要花些时间。所以关于连表,我们一般建议最多三表连查为最佳。另外还有主键的设置,虽然可以提高查询的效率,但也会因为增删改而影响效率,是一把双刃剑。


如何进行慢sql的优化


第一步,查询哪些sql语句属于慢sql


有个东西叫慢sql日志功能,在mysql中,会有一个日志文件用于记录执行时间超过指定时间的sql,这个日志文件就叫sql日志。此功能在mysql中默认不开启,如果需要使用,需要手动开启。


第二步,我们来看看有哪些sql可以用来操作慢sql


查看慢sql日志是否打开


show variables like 'slow_query_log';


开启慢sql日志功能

//执行时间超过10s时,默认视为慢sql,会将该sql记录到日志文件中。
set global slow_query_log=1


查询慢sql日志设置的超时时间

show global variables like 'long_query_time'


修改慢sql设置的超时时间

set global long_query_time=20


查看日志文件

show variables  like 'slow_query_log_file'


注意事项


对慢sql进行设置后,需要重启数据库服务器,注意,不是重启数据库,博主一般会在任务管理器里面对数据库进行重启操作,仅仅重启数据库可能不会重启数据库的服务器;

慢sql的日志文件存储在数据库安装目录下的data文件夹下。


如何对sql进行优化


查询sql中是否使用了*,改为具体需要的字段;

查询sql是否使用了嵌套,连查的效率要高于嵌套,如果可以的话,将sql改为连查;

查询sql条件部分是否使用了索引,需要的话,可添加索引;

查询sql条件部分是否使用了索引,索引是否失效。


关于索引失效的场景,我将在下一篇博客中详细说明索引的种类,数据结构。


以上只是主要的大方向,有些人还会对order by,like,group by,limit,or,in做优化,都是一个方向,全都做到了,那基本就做到极致了。


但有时候,我们不能单单因为sql是慢sql就去优化sql,这是不正确的,虽然慢sql需要优化,但并不是所有的慢sql都需要优化,我们要看慢sql产生的原因,像上面说到的一些情况,如果优化了,效率并没有提高太多,那该怎么办?这就是我接下来要说的东西:对数据库进行优化。


数据库优化


数据库的优化有哪些?


我们一般会想到读写分离,读写分离了必然就要做主从复制,那集群也就产生了,如果用了微服务,那分库分表也势在必行,负载均衡也要跟上了,真是个大工程啊。


我们来做个整体的解释,假设我有主服务器master一台,从服务器salve三台,为什么要区分主从呢?因为功能不一样。我们的数据库访问分为读和写,读操作必定要远大于写操作。


假设我们做了主从,却只用master服务器进行读写,有两个问题:


第一,有没有可能写操作对主服务器中的表进行加锁?那是肯定的;


第二,其他三台从服务器作为小弟除了进行主从复制的数据同步外,就可以开开心心喝茶吗?那肯定不是,我master作为大哥也太累了,既要开店又要迎客,有三个小弟还不能使唤。


所以三台从服务器就要负责读的工作了,此时三台从服务器形成了一个集群,那么大并发条件下,负载均衡就要登场了,因为不能把工作全部给其中某个小弟做,所以我们要相对公平的分配给三个小弟,让他们都心理平衡。


关于负载均衡的策略,看选择什么组件,什么策略,比如轮询,权重等等,但今天它不在我们所要了解的知识体系内,我们以后再去说明。


服务器宕机的解决办法


数据库优化说了集群,那么总也要防止数据库所在服务器宕机,我们通常使用哨兵模式解决这个问题。


哨兵系统中会有多个哨兵存在,因为要避免哨兵错判的情况出现。每个哨兵都会通过心跳机制和所有的服务器保持联系,定时发出pin命令,服务器接收到之后会做出响应。若果某个哨兵没有接收到其中一台服务器的响应,主观认为这台服务器宕机,但是为了客观的公平,哨兵会向其他哨兵发出询问,若是半数以上的哨兵接受不到这台服务器的响应,则认为这台服务器宕机,如果是master宕机,哨兵系统会在从服务器中选出一台作为新的master服务器,将原来的master服务器从集群中移除,并通知所有的salve,有点昭告天下的味道了。这时候,其他的从salve自然是要服从于心的君主,和新的master建立联系。


索引


索引有很多好处,但也有缺点,前面优化sql时有提到过,本篇内容还是有点多的,大家看完消化下,索引将放在下一篇中重点说明,加个索引很简单,但里面却隐藏的你我不知道的大秘密,小不点儿也可以有大能耐。加的好,事半功倍;加的不好,作茧自缚。


结语


到这里,你应该了解了慢sql的基础优化方式,实际工作中,要贴合真实的场景去做优化,切勿盲目优化。还要格外注意表的创建,好的表结构可以减少相当多的工作量。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4天前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
6天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
21 6
|
6天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
18 4
|
12天前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
53 10
|
8天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
29 4
|
11天前
|
SQL 存储 缓存
SQL Server 数据太多如何优化
11种优化方案供你参考,优化 SQL Server 数据库性能得从多个方面着手,包括硬件配置、数据库结构、查询优化、索引管理、分区分表、并行处理等。通过合理的索引、查询优化、数据分区等技术,可以在数据量增大时保持较好的性能。同时,定期进行数据库维护和清理,保证数据库高效运行。
|
7天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
8天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
21 0
WK
|
13天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
27 0
|
5月前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程