慢SQL优化的30个思路方案整理

文章目录

      • (1)索引优化
      • (2)查询重构
      • (3)减少数据扫描量
      • (4)利用缓存
      • (5)分区表
      • (6)优化排序和分组
      • (7)业务查询条件限制优化
      • (8)使用搜索引擎
      • (9)业务逻辑优化
      • (10)避免使用临时表
      • (11)使用覆盖索引
      • (12)优化数据类型
      • (13)避免大事务
      • (14)调整数据库参数
      • (15)拆分大字段
      • (16)读写分离
      • (17)压缩数据
      • (18)异步处理
      • (19)定期清理无用数据
      • (21)数据库连接池优化
      • (22)使用分布式数据库
      • (23)分离冷热数据:
      • (24)避免长时间运行的查询
      • (25)使用并行查询
      • (26)使用合适的锁机制:
      • (27)拆分表结构
      • (28)避免过度规范化
      • (29)优化联合查询(UNION vs UNION ALL)
      • (30)监控和调优

在这里插入图片描述

(1)索引优化

绝大多数的慢SQL都可以通过索引优化。
确保查询涉及的字段上有合适的索引(如B树索引、哈希索引)。
避免在索引列上使用函数或运算,这会导致索引失效。

(2)查询重构

简化复杂的SQL查询,将一个大查询分解为多个小查询。
使用EXPLAIN查看查询执行计划,找出性能瓶颈。

(3)减少数据扫描量

使用LIMIT限制返回的行数。
只选择需要的列,不要使用SELECT *。

(4)利用缓存

利用数据库的查询缓存(如MySQL的Query Cache)
在应用层实现数据缓存(如Memcached、Redis)

(5)分区表

对大表进行分区,分区可以按时间、范围、哈希等方式。
查询时只扫描相关分区,减少不必要的数据扫描。

(6)优化排序和分组

确保ORDER BY和GROUP BY涉及的列上有索引。
尽量减少排序和分组操作的数据量。

(7)业务查询条件限制优化

对于一些特别大的表,单靠索引优化可能效果有限。这时,可以通过业务层面的优化来限制查询的时间范围,从而缩小查询范围,提高查询性能。以下是一些业务上可以采取的优化措施:
对大表进行时间范围分区(如按月、按季度),在查询时只针对相关时间段的分区进行查询,避免全表扫描。在业务层限制查询的时间窗口,如只允许查询最近一年的数据。对于超出时间窗口的查询,可以要求用户提供更具体的查询条件以缩小查询范围。
将历史数据定期归档到历史表或其他存储介质中,保持主表的数据量在一个合理范围内。查询时先在主表中查找,如果需要再到历史表中查找。
对用户查询结果进行分页处理,每次只返回一部分数据,避免一次性查询大量数据。使用适当的分页算法(如OFFSET-LIMIT,基于ID的分页)以提高分页查询效率。

(8)使用搜索引擎

对于需要进行全文搜索的大表,考虑使用搜索引擎(如Elasticsearch)来替代数据库查询。
搜索引擎可以提供更高效的全文检索和复杂查询能力。

(9)业务逻辑优化

从业务逻辑入手,优化查询需求和频率,避免不必要的频繁查询。对一些复杂的查询需求进行重构,减少对数据库的压力。

(10)避免使用临时表

尽量避免使用临时表,因为临时表会导致磁盘I/O。如果必须使用,确保临时表有索引。

(11)使用覆盖索引

尽量使用覆盖索引,即索引中包含查询所需的所有列,从而避免回表操作,提高查询效率。

(12)优化数据类型

使用合适的数据类型,尽量选择占用存储空间较小且能满足业务需求的数据类型(如INT代替VARCHAR)

(13)避免大事务

尽量避免长时间运行的大事务,因为大事务会锁定大量数据,影响其他查询的执行。

(14)调整数据库参数

根据具体的硬件和应用需求,调整数据库的配置参数(如内存分配、缓存大小、连接池配置等)以优化性能。

(15)拆分大字段

将包含大字段(如BLOB、TEXT等)的表进行拆分,将大字段放在单独的表中,以减少主表的存储开销和查询压力。

(16)读写分离

将读操作和写操作分离,通过主从复制实现读写分离,减少主库压力,提高读性能。

(17)压缩数据

使用数据压缩技术(如MySQL的InnoDB表压缩)来减少存储空间和I/O开销,提高查询性能。

(18)异步处理

对一些非实时性要求高的查询,采用异步处理方式,减少对主业务流程的影响。

(19)定期清理无用数据

定期清理无用数据(如日志数据、临时数据等),保持表数据量在合理范围内。
(20)数据分布均匀性
确保数据在分区或分片中的分布均匀,以避免某些分区或分片成为性能瓶颈。可以通过分析数据分布情况,调整分区键或分片策略来改善。

(21)数据库连接池优化

使用数据库连接池可以复用数据库连接,减少建立和销毁连接的开销。调整连接池的参数(如最大连接数、空闲连接数)可以提高系统的并发处理能力。

(22)使用分布式数据库

对于超大规模数据,可以考虑使用分布式数据库(如CockroachDB、TiDB)来分散数据存储和查询负载,提升系统的可扩展性和性能。

(23)分离冷热数据:

将访问频率较高的热数据与访问频率较低的冷数据分离存储。可以将热数据保存在性能较高的存储介质中,冷数据保存在成本较低的存储介质中。这样可以提高常用查询的性能。

(24)避免长时间运行的查询

长时间运行的查询会占用大量资源,影响其他查询的执行。将复杂查询拆分为多个小查询,或使用异步处理方式,避免影响整体性能。

(25)使用并行查询

对于大数据量的查询,可以启用并行查询,通过多个线程同时执行查询操作,提高查询性能。并行查询可以充分利用多核CPU的计算能力。

(26)使用合适的锁机制:

根据业务需求选择合适的锁机制,例如行锁、表锁、悲观锁和乐观锁。尽量避免使用全表锁,以减少锁冲突和提高并发性能。

(27)拆分表结构

对于非常宽的表,可以将不常用的列拆分到另外的表中,通过垂直拆分减少表的宽度,提高查询性能。例如,将用户的基本信息和扩展信息分开存储。
水平分表或者垂直分表。

(28)避免过度规范化

过度规范化会导致查询时需要大量JOIN操作,影响性能。在某些场景下,可以通过适度反规范化(如冗余存储一些数据)来减少JOIN操作,提高查询性能。

(29)优化联合查询(UNION vs UNION ALL)

在联合查询中,尽量使用UNION ALL而不是UNION。UNION会去除重复的记录,需要额外的排序和去重操作,性能较差。而UNION ALL直接合并结果集,不进行去重,性能更好。如果业务逻辑允许,优先使用UNION ALL。

(30)监控和调优

持续监控数据库性能,通过分析慢查询日志、资源使用情况等,找出性能瓶颈并进行针对性调优。使用专业的数据库监控工具(如Prometheus、Grafana)可以帮助实时监控和分析数据库性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/394554.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openfoam模拟时取消报错Floating point exception (core dumped),从而看到具体错误内容

一、理论简介: unset FOAM_SIGFPE 是用于在 OpenFOAM 环境中解除对浮点异常(Floating Point Exception, FPE)的信号处理。 FOAM_SIGFPE 环境变量的作用 在 OpenFOAM 中,FOAM_SIGFPE 环境变量用于控制程序对浮点异常&#xff08…

【设计模式】设计模式之观察者模式

文章目录 观察者模式什么是观察者模式引入组成UML图代码实现1. 定义观察者接口2. 定义主题接口3. 实现具体观察者4. 实现具体被观察者5.测试 应用场景优点缺点 观察者模式 什么是观察者模式 观察者模式(Observer Pattern)是一种设计模式 它定义了一种…

BTS4140N:高侧电源开关芯片中文数据手册

芯片概述 : BTS4140N是一款智能高压侧电源开关N沟道垂直功率MOSFET,带电荷泵和电流控制输入、采用智能SIPMOS技术单片集成,提供嵌入式保护和诊断功能。 芯片特征描述 电流控制输入短路保护电流限制欠电压时关断过压保护(包括负载突…

【mars3d】GraphicLayer遍历添加数据,正确拿到数据

import * as mars3d from "mars3d"export let map // mars3d.Map三维地图对象 export let graphicLayer // 矢量数据图层 export const mapOptions {scene: {center:{"lat":30.577085,"lng":116.885511,"alt":45203.5,"heading&…

Jenkins参数化构建

目录 一. 准备ansible 二. Gitlab新建子项目 三. Jenkins建立任务,进行初步配置 四. 导入nginx主机的公钥 五. 配置ansible执行脚本 六. 构建测试 一. 准备ansible 在jenkins主机中安装ansible [rootjenkins ~]# yum install -y epel-release [rootjenkins…

【学习笔记】Day 6

一、进度概述 1、《地震勘探原理》第二章 2、“DenseNet” 周报分享 二、详情 1、《地震勘探原理》第二章 注:本来的打算是逐章整理,但是在听老师指导后,明晰了学习目的。故学习方法更改为侧重 “刷” 。不求一遍全弄懂&#xff0c…

AI在商品计划领域的应用

在现代商业环境中,AI驱动的商品计划优化已经成为企业有效管理资源和提高利润的关键因素。 市场预测与库存管理 精准市场预测:以某著名零售品牌为例,该品牌引入了一种基于AI的智能分析工具,帮助实现了精准的市场预测与库存管理。根…

【Linux基础】Linux基本指令(一)

目录 前言一, ls指令二,pwd指令三,cd指令3.1 当前目录与上级目录3.2 绝对路径和相对路径3.3 tree指令 四,创建一个普通文件或目录4.1 touch指令4.2 mkdir指令 五,删除目录或文件5.1 rmdir指令5.2 rm 指令 六&#xff0…

细节持续跟新

1.input的自带光标如何去除 2.阻止事件冒泡 3.获取父亲兄弟的innertext 4.画表格 参考博主链接 前端-HTML表格制作_哔哩哔哩_bilibili 美化

不同环境下RabbitMQ的安装-3 操作RabbitMQ

前面两篇从不同环境下RabbitMQ的安装-1 为什么要使用消息服务 到同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ介绍了关于如何在ARM架构、X86架构和Window系统下如何安装,各位小伙伴可以根据自己的实际开发场景参考安装。 到本篇是一些…

【ARM】CMSIS 软件标准接口

目录 CMSIS:Cortex Microcontroller Software Interface Standard1. 概述2. CMSIS-Core2.1 概述2.2 关键组件2.3 示例代码2.4 详细解释 3. CMSIS-DSP3.1 概述3.2 关键组件3.3 示例代码3.4 详细解释 4. CMSIS-RTOS4.1 概述4.2 关键组件4.3 示例代码4.4 详细解释 5. C…

【案例40】Apache中mod_proxy模块的使用

NC中间件 应用场景:配置了apache的情况,包括uap集群,配置https等场景下均适用;如果是单机(NC单结点情况不存在问题,则不用配置这项; was环境也不用配置此项。) 解决方案:按如下两…

Spring Boot 3.x Rest API最佳实践之API设计

本系列教程将会以企业中API基础功能封装为目标,用最新的Spring Boot 3.x版本来逐步搭建和完善Rest API项目基础架构,并结合实际电商项目中API的实现需求来进行最佳实践。如果觉得对你有帮助,记得点赞收藏,关注小卷,后续…

React性能之--如何避免组件重复渲染?

在react中,我们会发现存在组件会重复渲染,虽然说如果项目不大的话,这点影响不大,但是我们还是尽量避免组件渲染比较好,养成好习惯,尽可能让不管是大小项目,都让性能尽可能优化 。那我们如何避免…

Linux/C 高级——Linux命令

从这里开始,我们展开对Linux/c 高级的学习,首先介绍的是在Linux/c高级中,Linux的部分 目录 1.Linux简介 1.1Linux起源 1.2查看系统版本命令 1.3分层结构 1.4系统关机重启命令 2.Linux安装工具 2.1软件包安装 2.1.1软件包的管理机制 …

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(上)

第6章 电子表格软件Excel 2016 6.1 Excel 2016入门6.1.1 Excel 2016 简介6.1.2 Excel 2016 的操作界面组成6.1.3 Excel 2016 的视图方式6.1.4 Excel 2016 的工作簿及其操作6.1.5 Excel 2016 的工作表及其操作6.1.5 Excel 2016 的工作表及其操作6.1.6 Excel 2016 的单元格及其操…

Typora+PicGo-Core(command line)+Gitee 实现上传图片到图床(看这一文就够)

前言 ​ 对于喜欢写Markdown文档的人来说,Typora无疑是一个写作利器,它有别于其他的Markdown软件,不是一边编辑一边渲染,而是即写即渲染,这样对于浏览md文件也非常友好。此外Typora还支持更换主题,在其官网…

【QT】Qt中Websocket的使用

一、WebSocket的定义 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,…

arcgis(shp)注记转CAD(dwg)文字

arcgis(shp)注记转CAD(dwg)文字方法如下: 1、添加shp文件,标注要素,然后选标注转注记 2、 点击文件夹图标打开文件夹,选择保存路径。(提前需新建好文件地理数据库、数据…

#java学习笔记(面向对象)----(未完结)

一基础相关知识点: 1. 一个对象的调用 首先我们创建一个Phone类 public class Phone {//成员变量String name;int age;String favourite;//成员方法public void myName(){System.out.println(name);}public void myAge(){System.out.println(age);}public void m…