【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台服务器,两个应用。小规模管…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
