当前位置: 首页 > news >正文

3. SQL优化

SQL性能优化

在日常开发中,MySQL性能优化是一项必不可少的技能。本文以具体案例为主线,结合实际问题,探讨如何优化插入、排序、分组、分页、计数和更新等操作,帮助你实现数据库性能的飞跃。


一、索引设计原则

索引是MySQL优化的核心,合理的索引设计能显著提升性能。以下为关键原则:


二、insert 优化

2.1 批量插入

与单条插入相比,批量插入大幅减少网络开销和SQL解析成本:

-- 单条插入
INSERT INTO users (name, age) VALUES ('Alice', 25);-- 批量插入
INSERT INTO users (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 35);

建议:尽量使用批量插入以提升效率。

2.2 手动控制事务

将多条INSERT语句包裹在事务中,减少频繁提交的开销:

START TRANSACTION;
INSERT INTO users (name, age) VALUES ('Alice', 25);
INSERT INTO users (name, age) VALUES ('Bob', 30);
COMMIT;

2.3 大批量数据插入

对于大批量数据,使用LOAD DATA语句导入效率更高:

-- 1. 客户端连接服务端时,加上参数 -–local-infile
mysql –-local-infile -u root -p
-- 2. 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
-- 3. 执行load指令将准备好的数据,加载到表结构中
LOAD DATA INFILE '/root/mysql-data/data.csv' 
INTO TABLE users 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n';load data local infile '/root/mysql-data/data.sql' into table `users` fields terminated by ',' lines terminated by '\n';

三、order by 优化

MySQL排序主要有两种方式:

  1. Using filesort:通过临时表排序,性能较低。
  2. Using index:利用索引直接排序,性能较高。

优化策略

  • 创建索引:为ORDER BY字段创建索引,让MySQL直接使用索引排序。
-- 创建索引
CREATE INDEX idx_age ON users (age);-- 优化查询
SELECT * FROM users ORDER BY age;

原则
order by优化原则:

  • A. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  • B. 尽量使用覆盖索引。
  • C. 多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
  • D. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小
    sort_buffer_size(默认256k)。

四、group by 优化

分组查询GROUP BY可以通过索引来提升性能。索引需满足最左前缀法则

-- 无索引时的查询
EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY age ASC, phone DESC;-- 添加索引后优化
CREATE INDEX idx_user_age_phone_aa 
ON tb_user (age ASC, phone DESC);EXPLAIN SELECT id, age, phone FROM tb_user ORDER BY age ASC, phone DESC;

最左前缀法则:如果联合索引的前几个字段包含分组字段,则查询效率更高。


五、limit 优化

分页查询中,偏移量越大,性能越低。以下是优化思路:

5.1 常规查询(低效)

SELECT * FROM users LIMIT 100000, 10;

5.2 优化方式:使用覆盖索引和子查询

-- 优化分页查询
SELECT * FROM users 
WHERE id > (SELECT id FROM users ORDER BY id LIMIT 100000, 1) 
LIMIT 10;

覆盖索引:只返回查询字段所需的索引数据,避免访问表的其他列,提高效率。


六、count() 优化

6.1 常见计数方式及性能分析

计数方式含义效率
COUNT(字段)遍历表并检查字段是否为NULL较低
COUNT(主键)遍历表并直接计数主键行。较高
COUNT(1)遍历表但不取值,仅直接按行计数。
COUNT(*)专门优化,不取值,仅直接按行计数。COUNT(1)效率相当

建议:优先使用COUNT(*),性能最优且语义清晰。


七、update 优化

7.1 行锁与表锁

MySQL的InnoDB存储引擎采用行锁,但当索引失效时会升级为表锁,严重影响性能。例如:

-- 锁定单行(高效)
UPDATE course SET name = 'JavaEE' WHERE id = 1;-- 锁定全表(低效)
UPDATE course SET name = 'SpringBoot' WHERE name = 'PHP';

说明:第二条语句因未命中索引,行锁升级为表锁。

7.2 优化策略

  • 确保查询条件命中索引。
  • 避免一次更新过多行。
-- 添加索引优化
CREATE INDEX idx_name ON course (name);
UPDATE course SET name = 'SpringBoot' WHERE name = 'PHP';

总结

MySQL性能优化的核心在于充分利用索引、批量操作和事务控制,同时针对具体场景调整策略。希望本文的案例和原则能帮助你在实际开发中事半功倍!

相关文章:

3. SQL优化

SQL性能优化 在日常开发中,MySQL性能优化是一项必不可少的技能。本文以具体案例为主线,结合实际问题,探讨如何优化插入、排序、分组、分页、计数和更新等操作,帮助你实现数据库性能的飞跃。 一、索引设计原则 索引是MySQL优化的…...

web——upload-labs——第十一关——黑名单验证,双写绕过

还是查看源码, $file_name str_ireplace($deny_ext,"", $file_name); 该语句的作用是:从 $file_name 中去除所有出现在 $deny_ext 数组中的元素,替换为空字符串(即删除这些元素)。str_ireplace() 在处理时…...

AWS CLI

一、AWS CLI介绍 1、简介 AWS CLI(Amazon Web Services Command Line Interface)是一个命令行工具,它允许用户通过命令行与 Amazon Web Services(AWS)的各种云服务进行交互和管理。使用 AWS CLI,用户可以直接在终端或命令行界面中执行命令来配置、管理和自动化AWS资源,…...

springboot:责任链模式实现多级校验

责任链模式是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。 当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。 属于行为型模式…...

CentO7安装单节点Redis服务

本文目录 一、Redis安装与配置1.1 安装redis依赖1.2 上传压缩包并解压1.3 编译安装1.4 修改配置并启动1、复制配置文件2、修改配置文件3、启动Redis服务4、停止redis服务 1.5 redis连接使用1、 命令行客户端2、 图形界面客户端 一、Redis安装与配置 1.1 安装redis依赖 Redis是…...

FreeRTOS学习14——时间管理

时间管理 时间管理FreeRTOS 系统时钟节拍FreeRTOS 系统时钟节拍简介FreeRTOS 系统时钟节拍处理FreeRTOS 系统时钟节拍来源 FreeRTOS 任务延时函数vTaskDelay()vTaskDelayUntil() 时间管理 在前面的章节实验例程中,频繁地使用了 FreeRTOS 提供的延时函数&#xff0c…...

统⼀数据返回格式快速⼊⻔

为什么会有统⼀数据返回? 其实统一数据返回是运用了AOP(对某一类事情的集中处理)的思维。 优点: 1.⽅便前端程序员更好的接收和解析后端数据接⼝返回的数据。 2.降低前端程序员和后端程序员的沟通成本,因为所有接⼝都…...

Python学习------第十天

数据容器-----元组 定义格式,特点,相关操作 元组一旦定义,就无法修改 元组内只有一个数据,后面必须加逗号 """ #元组 (1,"hello",True) #定义元组 t1 (1,"hello") t2 () t3 tuple() prin…...

Win11 24H2新BUG或影响30%CPU性能,修复方法在这里

原文转载修改自(更多互联网新闻/搞机小知识): 一招提升Win11 24H2 CPU 30%性能,小BUG大影响 就在刚刚,小江在网上冲浪的时候突然发现了这么一则帖子,标题如下:基准测试(特别是 Time…...

element ui 走马灯一页展示多个数据实现

element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 element ui 走马灯一页展示多个数据实现 主要是对走马灯的数据的操作,先看js处理 let list [{ i: 1, name: 1 },{ i: 2, name: 2 },{ i: 3, name: 3 },{ i: 4, name: 4 },]let newL…...

40分钟学 Go 语言高并发:Goroutine基础与原理

Day 03 - goroutine基础与原理 1. goroutine创建和调度 1.1 goroutine基本特性 特性说明轻量级初始栈大小仅2KB,可动态增长调度方式协作式调度,由Go运行时管理创建成本创建成本很低,可同时运行数十万个通信方式通过channel进行通信&#x…...

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域,Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展,这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件,帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…...

【K8S系列】Kubernetes集群资源管理与调度 深度分析

在现代微服务架构中,Kubernetes(K8s)作为容器编排平台,提供了强大的资源管理和调度能力。然而,随着应用规模的扩大和复杂性增加,如何高效地管理和调度集群资源成为一个关键挑战。本文将深入探讨 Kubernetes…...

delphi fmx android 离线人脸识别

搜遍全网都没有找到delphi android 能用的 离线人脸识别,无需注册什么开发者 有这方面需求的可以用fsdk 这边用的luxand.FSDK8.0 android下的注册号要自己找下 1,用老猫的工具将android 下的sdk,FSDK.java 编译成FSDK.jar 老猫的工具 2,用上面的工具将FSDK.jar 生成de…...

Linux mountpoint 命令详解

前言 在 Linux 系统中,文件系统管理是一个非常重要的任务。mountpoint 是一个常用的小工具,用于检查目录是否是挂载点。本篇博客将详细介绍 mountpoint 命令的用法及其在日常系统管理中的应用。 什么是挂载点? 挂载点是一个目录&#xff0…...

Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验

在前面章节,我们有过使用寄存器去编写字符设备的经历了。这种直接在驱动代码中, 通过寄存器映射来对外设进行使用的编程方式,从驱动开发者的角度可以说是灾难。 因为每当芯片的寄存器发生了改动,那么底层的驱动几乎得重写。 那么…...

用sqlmap工具打sqli-labs前20关靶场

这个星期我们用手动注入打了前20关靶场,今天我们用sqlmap直接梭哈前20关 1.介绍sqlmap sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL和SQL注入漏洞。 2.下载和使用sqlmap 官方下载地址:GitHub - sq…...

代码随想录算法训练营第二十一天 | 93.复原IP地址 | 78.子集

Day 20 总结 自己实现中遇到哪些困难 一句话讲明白问题分类 组合问题和分割问题都是收集树的叶子节点,子集问题是找树的所有节点!切割字符串问题回顾 昨天的切割回文子串,和今天的切割ip地址,都是需要将字符串拆分成 n 份。只不过…...

#Uniapp篇:支持纯血鸿蒙发布适配UIUI

uni-ui梳理 组件生命周期 https://uniapp.dcloud.net.cn/tutorial/page.html#componentlifecycle 页面生命周期 https://uniapp.dcloud.net.cn/collocation/App.html#applifecycle onLaunch 当uni-app 初始化完成时触发(全局只触发一次)&#xff0c…...

边缘提取函数 [OPENCV--2]

OPENCV中最常用的边界检测是CANNY函数 下面展示它的用法 通常输入一个灰度图像(边界一般和颜色无关)这样也可以简化运算cv::Canny(inmat , outmat , therhold1, therhold2 ) 第一个参数是输入的灰度图像,第二个是输出的图像这两个参数都是引用…...

机器学习在芯片电容提取中的应用与CapBench数据集

1. 电容提取与机器学习结合的背景与挑战在芯片设计流程中,电容提取是决定最终产品性能的关键环节。当设计进入物理实现阶段,工程师需要精确计算互连线之间的寄生电容,这些数据直接影响时序分析和功耗估算的准确性。传统基于场求解器的方法&am…...

AI技能gate-of-oss:智能海巡GitHub,高效开源项目选型

1. 项目概述:一个帮你“海巡”GitHub的AI技能在软件开发这个行当里,我敢说,几乎每个开发者都经历过这样的时刻:为了解决一个具体问题,或者想给项目引入一个新功能,一头扎进GitHub的汪洋大海,试图…...

最后30天,PMP备考需要一次“认知切换”

背完所有知识点的人不一定能考过,但做对这三类切换的人一定能。大家好,我又来了。距离2026年6月14日PMP考试还有大约一个月的时间。如果看了我以前的文章,你已经知道这次考试很特殊——6月这场是现行考纲的绝版场次,之后考纲将从人…...

英特尔无人机芯片战略:从RealSense到异构计算的技术博弈与市场挑战

1. 从移动梦碎到天空野心:英特尔为何押注无人机芯片?2016年5月,当英特尔在加州棕榈泉的夜空中点亮100架编队飞行的无人机时,这场名为“Drone 100”的灯光秀,其意义远不止一场炫目的营销。它更像是一份宣言,…...

泰拉瑞亚地图编辑器TEdit:5步打造专业级游戏世界的终极指南

泰拉瑞亚地图编辑器TEdit:5步打造专业级游戏世界的终极指南 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets y…...

HDiffPatch嵌入式系统应用:如何在MCU和NB-IoT设备上实现OTA更新

HDiffPatch嵌入式系统应用:如何在MCU和NB-IoT设备上实现OTA更新 【免费下载链接】HDiffPatch a C\C library and command-line tools for Diff & Patch between binary files or directories(folder); cross-platform; runs fast; create small delta/different…...

“为什么我的NotebookLM Agent总在胡说?”——20年NLP老兵手把手调试LLM引用可信度的5个黄金检查点

更多请点击: https://intelliparadigm.com 第一章:NotebookLM Agent研究辅助 核心能力与适用场景 NotebookLM Agent 是 Google 推出的基于私有文档理解的 AI 助手,专为研究者设计。它支持上传 PDF、TXT、Markdown 等格式的研究资料&#xf…...

Claude Code环境变量配置全解析:从入门到精通

1. 项目概述:Claude Code 环境变量配置生成器如果你和我一样,是 Claude Code 的深度用户,那你一定经历过这样的时刻:面对一个复杂的开发任务,想调整一下模型的思考深度(Effort Level)来平衡成本…...

Codepack:标准化开发配置与自动化工具链的工程实践

1. 项目概述:一个为开发者准备的“代码行囊” 最近在GitHub上闲逛,发现了一个挺有意思的项目,叫 JasonLovesDoggo/codepack 。乍一看名字,你可能会觉得这又是一个普通的代码库或者工具集。但点进去仔细研究后,我发现…...

工业视觉杂散物检测系统方案设计

构建一套完整可靠的工业视觉检测系统,核心在于将其无缝嵌入到现有的装配流程中。下面是一个从系统架构部署、执行标准、再到具体模块技术选型的完整实施方案,希望能帮你构建一套精准且高效的检测闭环。 🏗️ 系统总体架构 一个完整的检测系统…...