【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台服务器,两个应用。小规模管…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
