【MySQL 进阶之路】SQL 优化
6.SQL 性能分析笔记
在现代数据库的高并发环境下,SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略,包括插入优化、主键设计、排序优化、GROUP BY
优化等,帮助你在面对大规模数据时,做到高效查询和数据处理。
1. 插入优化
1.1 使用 LOAD DATA LOCAL INFILE
在大批量插入数据时,普通的 INSERT INTO
语句可能会变得非常慢,特别是在数据量很大的时候。相较之下,LOAD DATA LOCAL INFILE
是一种更高效的批量插入方式。
LOAD DATA LOCAL INFILE '/path/test.sql' INTO TABLE tables_name FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
LOAD DATA
使用本地文件系统的数据文件(如 CSV、SQL)进行数据加载,效率远高于普通的逐行插入。- 可以跳过数据库的日志和约束检查,使得大量数据插入时性能大幅提升。
1.2 使用自增主键顺序插入
- 使用自增主键可以保证数据按照顺序插入,避免页分裂。
- 设计主键时,尽量选择自增型主键,避免使用像 UUID 这样的无序标识符。
2. 主键设计与优化
2.1 主键长度设计
- 主键设计时,要尽量避免使用过长的数据类型(如长字符串、UUID、MD5等),否则会导致索引占用更多存储空间,查询效率下降。
- 尽量使用数字型(如 INT 或 BIGINT)作为主键。
2.2 主键顺序插入
在 MySQL 中,InnoDB
存储引擎会根据主键顺序进行数据存储,因此插入数据时,保持主键顺序(如自增主键)能有效减少页分裂,提高插入效率。
2.3 页分裂与页合并
页分裂
当一个数据页填满后,InnoDB
会自动将该页分裂成两个页,并重新分配数据,这个过程会导致性能下降。因此,尽量按顺序插入数据,避免频繁的页分裂。
页合并
当数据删除导致某个页的元素数量少于一定阈值时,InnoDB
会将这些页合并。合并操作也会导致性能下降,因此需要避免过度删除数据。
3. ORDER BY 优化
3.1 创建合适的索引
- 在需要排序的字段上创建索引,可以提高排序效率。通常,创建索引时,字段顺序要与
ORDER BY
子句中的字段顺序一致。 - 如果
ORDER BY
中涉及多个字段,要遵循 最左前缀法则,即从左到右依次覆盖索引的字段。
CREATE INDEX idx_xx_xx ON tb(a ASC, d DESC);
3.2 使用 Using filesort
和 Using index
- Using filesort:如果查询中没有适合的索引,数据库会先进行全表扫描,然后在内存中对结果进行排序,使用的是“文件排序”,这通常比通过索引排序更耗时。
- Using index:如果查询能够直接利用索引的顺序返回结果,就会跳过额外的排序过程,使用索引直接返回排序好的数据,操作效率高。
3.3 避免不必要的排序
尽量避免在查询中做不必要的排序操作,特别是在大量数据的情况下,排序会导致严重的性能瓶颈。
4. GROUP BY 优化
4.1 使用联合索引
在进行 GROUP BY
操作时,最好确保涉及的字段已经建立索引,尤其是联合索引。联合索引可以减少查询的扫描范围,提高查询效率。
CREATE INDEX idx_group_by ON tb(a, b, c);
4.2 遵循最左前缀法则
对于多字段索引,查询的 GROUP BY
字段应该遵循最左前缀法则,确保查询可以充分利用索引来提高性能。
5. LIMIT 优化
5.1 使用覆盖索引和子查询
在使用 LIMIT
限制返回结果集时,可以考虑使用覆盖索引来避免回表操作,提高查询性能。
SELECT id, name FROM tb WHERE status = 1 LIMIT 100;
若能在 id
和 status
上建立联合索引,可以避免访问数据页,只通过索引获取所需数据。
5.2 避免在大数据量下使用 LIMIT
当表中数据量非常大时,LIMIT
查询可能会导致全表扫描,尤其是在没有合适索引的情况下。因此,在查询时,尽量优化索引和查询条件,减少数据的扫描范围。
6. COUNT 优化
6.1 使用 COUNT(*)
替代 COUNT(字段)
COUNT(*)
是最优的统计方式,数据库会直接扫描整个数据表,避免了对某个字段的额外操作。- 如果使用
COUNT(字段)
,数据库会首先检查该字段的非空值,因此性能会有所下降。
6.2 索引优化
在 COUNT
查询中,如果能利用索引,性能会显著提高。例如,使用主键字段进行 COUNT
会比使用普通字段更高效。
7. UPDATE 优化
7.1 使用索引字段更新
在更新数据时,尽量使用索引字段作为查询条件,这样可以减少数据库扫描的行数,提高更新效率。
UPDATE your_table SET status = 1 WHERE id = 100;
7.2 避免更新非索引字段
如果更新的字段没有索引,数据库会进行全表扫描来找到匹配的记录,造成严重的性能问题。
7.3 行锁和表锁
InnoDB
引擎在更新时会使用行级锁(即针对索引加锁),而非全表锁。要避免索引失效,因为索引失效时,行锁会升级为表锁,严重影响性能。
8. 总结
通过上述优化技巧,你可以大大提高数据库查询的效率,尤其是在大数据量场景下。总结几个关键点:
- 尽量使用高效的插入方法,如
LOAD DATA LOCAL INFILE
。 - 设计合理的主键,避免使用 UUID 或过长的字符串。
- 在排序、分组和计数操作中使用合适的索引。
- 更新操作时,应确保查询条件中有索引字段。
- 了解并合理运用数据库的锁机制,减少表锁带来的性能损失。
持续关注数据库优化的最佳实践,不断调整和优化 SQL 查询,将为你的系统带来显著的性能提升。
相关文章:

【MySQL 进阶之路】SQL 优化
6.SQL 性能分析笔记 在现代数据库的高并发环境下,SQL 查询优化成为提升系统性能和响应速度的关键。本文将总结常见的 SQL 优化策略,包括插入优化、主键设计、排序优化、GROUP BY 优化等,帮助你在面对大规模数据时,做到高效查询和…...

Web3的技术栈详解:解读区块链、智能合约与分布式存储
随着数字时代的不断发展,Web3作为下一代互联网的核心理念逐渐走进了大众视野。它承载着去中心化、用户主权以及更高效、更安全的网络环境的期望。Web3不再是由少数中心化机构主导的网络,而是通过一系列核心技术的支撑,给每个用户赋予了更多的…...

[在线实验]-在docker中运行clickhouse
镜像下载 docker的clickhouse镜像资源-CSDN文库 加载镜像 首先,需要获取ClickHouse的Docker镜像。如果已经有镜像文件(如clickhouse.tar),可以使用docker load命令来加载它: docker load --input clickhouse.tar …...

Rust常用命令总结
安装Rust 检查并更新Ubuntu的软件包 $ sudo apt update $ sudo apt upgrade安装相关依赖:安装GCC、G、MAKE、curl $ sudo apt install build-essential $ sudo apt install curl安装Rust $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh执行命令…...

Ant-Design X,AI组件库
前端的小伙伴们都知道有一个前端组件库超级火,可以说是 Top1 级别的,那就是 Ant-Design 而就在最近,他们又推出了一款新的组件库,Ant-Design X,这是专门用来做 AI 产品 的组件库,可能大家还很疑惑…...

Matplotlib 内置的170种颜色映射(colormap)
Matplotlib 提供了许多内置的颜色映射(colormap)选项,可以将数值数据映射到色彩范围——热力图、温度图、地图等可视化经常会用到。 # colormap 有两种引用形式plt.imshow(data, cmapBlues)plt.imshow(data, cmapcm.Blues) 颜色映射可以分为…...

在linux虚拟机安装VMware tools
安装UKUI桌面后,在火狐浏览器输入下载VMware tool地址: https://gitcode.com/open-source-toolkit/395d3/blob/5faa176939c7ac1f614a8b6f07f14cc31433ff95/VMwareTools-10.3.21-14772444.tar.gz 解压下载的软件包,进入目录:vmwa…...

初识EasyFramework
一、获取EF Git地址:https://github.com/HiWenHao/EFrameworkGitee地址:https://gitee.com/wang_xiaoheiiii/EFramework视频合集:EasyFramework介绍_哔哩哔哩_bilibiliQQ群: 711540505 二、 下载并初步了解 1. 下载完成后,可以看…...

OpenStack-Glance组件
Glance Glance使用磁盘格式和容器格式基础配置镜像转换 Glance 是 OpenStack 的镜像服务,负责存储、发现和管理虚拟机镜像。它允许用户创建和共享镜像,用于启动虚拟机实例。 Glance 的主要功能 (1)虚拟机镜像的管理 支持镜像的上…...

SPC三种判定准则的算法
1.连续6个点递增或递减 //传入数据列表 //返回连续X个及以上递增或递减的数组下标int n = array.Length; int X = X_in; List<int> regions_start = new List<int>(); List<int> regions_end = new List<int>();if(Open){for (int i = 0; i < n - (…...

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题
20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起:中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…...

Mybatis @MapKey注解实现List转Map
文章目录 MapKey介绍MapKey示例- 传统的写法- MapKey的写法 MapKey介绍 在MyBatis中,MapKey 主要用于在映射查询结果到一个Map。 当你执行一个查询并期望返回一个Map时,你可以使用MapKey来进行结果集的映射。而Mybatis内部会将查询到的结果映射为一个k…...

vue中使用socket.io统计在线用户
目录 一、引入相关模块 二、store/modules 中封装socketio 三、后端代码(nodejs) 一、引入相关模块 main.js 中参考以下代码 ,另外socketio的使用在查阅其它相关文章时有出入,还是尽量以官方文档为准 import VueSocketIO from vue-socket.io import SocketIO from socket.io-…...

zotero中pdf-translate插件和其他插件的安装
1.工具–》插件 2.找插件 3.点击之后看到一堆插件 4.找到需要的,例如pdf-translate 5.点击进入,需要看一下md文档了解下,其实最重要的就是找到特有的(.xpi file) 6.点击刚刚的蓝色链接 7.下载并保存xpi文件 8.回到zotero,安装并使…...

【Linux操作系统】多线程控制(创建,等待,终止、分离)
目录 一、线程与轻量级进程的关系二、进程创建1.线程创建线程创建函数(pthread)查看和理解线程id主线程与其他线程之间的关系 三、线程等待(回收)四、线程退出线程退出情况线程退出方法 五、线程分离线程的优点线程的缺点 一、线程…...

二百七十八、ClickHouse——将本月第一天所在的那一周视为第一周,无论它是从周几开始的,查询某个日期是本月第几周
一、目的 ClickHouse指标表中有个字段week_of_month,含义是这条数据属于本月第几周。 而且将本月第一天所在的那一周视为第一周,无论它是从周几开始的。比如2024-12-01是周日,即12月第一周。而2024-12-02是周一,即12月第二周 二…...

JVM八股文精简
目录 简述JVM类加载过程简述JVM中的类加载器简述双亲委派机制双亲委派机制的优点简述JVM内存模型简述程序计数器简述虚拟机栈简述本地方法栈简述JVM中的堆简述方法区简述运行时常量池简述Java创建对象的过程简述JVM给对象分配内存的策略Java对象内存分配是如何保证线程安全的如…...

深入解析CMake中的find_package()命令:工作原理及实际应用示例
深入解析CMake中的find_package()命令:工作原理及实际应用示例 在CMake中,find_package() 是一个复杂而强大的命令,用于在构建系统中定位外部依赖(通常是库),并配置必要的编译和链接设置。这个命令允许开发…...

使用数据层进行数据生命周期管理
作者:来自 Elastic Stef Nestor Elasticsearch 7.10 使配置数据生命周期变得不再那么复杂。在这篇博文中,我将介绍一些变化、如何使用它们以及一些最佳实践。 数据生命周期可以包含很多阶段,因此我们将涉及: 将集群划分为层&…...

Kubernetes架构原则和对象设计
云原生学习路线导航页(持续更新中) 快捷链接 Kubernetes常见问题解答 本文从 Google Borg系统的架构设计开始,深入讲解Kubernetes架构及组件的基本原理 1.什么是云计算 1.1.传统行业应用 假设有10台服务器,两个应用。小规模管…...

响应式编程一、Reactor核心
目录 一、前置知识1、Lambda表达式2、函数式接口 Function3、StreamAPI4、Reactive-Stream1)几个实际的问题2)Reactive-Stream是什么?3)核心接口4)处理器 Processor5)总结 二、Reactor核心1、Reactor1&…...

uniapp+vue3+ts请求接口封装
1.安装luch-request yarn add luch-requestnpm install luch-request2.新建文件src/utils/request.ts 需要自己修改config.baseURL和token(获取存储的token) // import HttpRequest from luch-request; import type { HttpRequestConfig, HttpRespons…...

【计算机网络】实验4:生成树协议STP的功能以及虚拟局域网VLAN
实验 4:生成树协议STP的功能以及虚拟局域网VLAN 一、 实验目的 加深对生成树协议STP的功能的理解。 了解虚拟局域网VLAN。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、验证交换机生成树协议STP的功能 (1) 第一步:构建网络拓…...

基于Matlab BP神经网络的电力负荷预测模型研究与实现
随着电力系统的复杂性和规模的不断增长,准确的电力负荷预测对于电网的稳定性和运行效率至关重要。传统的负荷预测方法依赖于历史数据和简单的统计模型,但这些方法在处理非线性和动态变化的负荷数据时,表现出较大的局限性。近年来,…...

java 21 多线程
1.相关概念 进程: 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷配新的内存空间。 进程是程序的一次执行过程&#…...

Rust学习笔记_07——枚举和范围
Rust学习笔记_04——引用 Rust学习笔记_05——控制流(1) Rust学习笔记_06——控制流(2) 文章目录 1. 枚举1.1基础1.2 给枚举变体起个“别名”1.3 枚举与匹配(match) 2. 范围2.1 介绍2.2 半开区间范围2.3 包含范围的语法糖2.4 步长范围(Range …...

40分钟学 Go 语言高并发:服务性能调优实战
服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标,确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…...

Windows通过指令查看已安装的驱动
Windows通过指令查看已安装的驱动 在 Windows 操作系统中,有几种命令可以用来查看已安装的驱动程序。以下是常见的几种方法: 1. 使用 pnputil 查看已安装驱动程序 pnputil 是一个 Windows 内置工具,可以列出所有已安装的驱动程序包。 命令…...

Windows 11 如何配置node.js
一,官网下载 官网首页 下载最新LTS版本,比较稳定,如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后,双击运行程序,点击next 2. 勾选接受协议,点击next 3. 选择自己的安装路径(默认是…...

AWTK fscript 中的 串口 扩展函数
fscript 是 AWTK 内置的脚本引擎,开发者可以在 UI XML 文件中直接嵌入 fscript 脚本,提高开发效率。本文介绍一下 fscript 中的 ** 串口 扩展函数 ** 1.iostream_serial_create 创建串口输入输出流对象。 原型 iostream_serial_create(device) > ob…...