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

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

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

相关文章

LiveGBS流媒体平台GB/T28181常见问题-作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办?

LiveGBS国标GB/T28181流媒体平台作为下级级联到海康大华宇视等第三方国标平台若需要提供国标编号、地址、端口号怎么办? 1、背景2、提供国标编号、地址、端口号3、搭建GB28181视频直播平台 1、背景 有篇博文曾经介绍过,LiveGBS国标视频平台支持GB/T2818…

【ArcGIS微课1000例】0132:从多个GIS视角认识与攀登珠穆朗玛峰

文章目录 1. Map Viewer中打开2. 场景查看器中打开3. ArcGIS中打开4. QGIS中打开5. Globalmapper中打开6. ArcGIS Earth中打开官网地址:https://www.arcgis.com/home/item.html?id=504a23373ab84536b7760c0add1e0c1c 1. Map Viewer中打开 以下展示不同底图样式的珠穆朗玛峰壮…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代,小程序租赁系统应运而生,成为企业管理租赁业务的一种新选择。随着移动互联网的普及,越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

第二十章 Spring之假如让你来写AOP——Aspect(切面)篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

Matplotlib | 结合numpy中argsort函数来画出特征阶梯图

代码 #构建分类随机森林分类器 clfRandomForestClassifier(n_estimators10,random_state42,max_depth4) clf.fit(x_val, y_val) #对自变量和因变量进行拟合 for feature in zip(x_feature,clf.feature_importances_):print(feature)(V1, 0.0038989752714058486) (V2, 0.002703…

【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本

GRAPH ATTENTION NETWORKS 代码详解 前言0.引言1. 环境配置2. 代码的运行2.1 报错处理2.2 运行结果展示 3.总结 前言 在前文中,我们已经深入探讨了图卷积神经网络和图注意力网络的理论基础。还没看的同学点这里补习下。接下来,将开启一个新的阶段&#…

Linux驱动开发(7):使用设备树实现RGB 灯驱动

通过上一小节的学习,我们已经能够编写简单的设备树节点,并且使用常用的of函数从设备树中获取我们想要的节点资源。 这一小节我们带领大家使用设备树编写一个简单的RGB灯驱动程序,加深对设备树的理解。 1. 实验说明 本节实验使用到 EBF6ULL-…

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧,在使用安卓手机fiddler抓包时,即使信任了证书,并且手机也安装了证书,但是还是无法捕获https请求的问题,最开始不知道原因,后来慢慢了解到现在有的app为了防止抓包,把…

【深度学习】循环神经网络及文本生成模型构建

循环神经网络 词嵌入层 ​ 词嵌入层的作用就是将文本转换为向量。 ​ 词嵌入层首先会根据输入的词的数量构建一个词向量矩阵,例如: 我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为: 100*128,输入的每…

51单片机基础01 单片机最小系统

目录 一、什么是51单片机 二、51单片机的引脚介绍 1、VCC GND 2、XTAL1 2 3、RST 4、EA 5、PSEN 6、ALE 7、RXD、TXD 8、INT0、INT1 9、T0、T1 10、MOSI、MISO、SCK 11、WR、RD 12、通用IO P0 13、通用IO P1 14、通用IO P2 三、51单片机的最小系统 1、供电与…

【前端知识】前端打包工具webpack深度解读

webpackandesign搭建前端脚手架 webpack概述一、核心功能二、主要特点三、核心概念四、使用场景五、安装与配置六、常用命令 配置文件详解一、基本结构二、主要配置项及其作用三、示例配置 加载器一、加载器的定义与作用二、常见的加载器类型及作用三、加载器的配置与使用四、加…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转(跨文件跳转)这些功能

(一)方法一:安装插件SystemVerilog - Language Support 安装一个vscode插件即可,插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&am…

uniapp vue3小程序报错Cannot read property ‘__route__‘ of undefined

在App.vue里有监听应用的生命周期 <script>// 只能在App.vue里监听应用的生命周期export default {onError: function(err) {console.log(AppOnError:, err); // 当 uni-app 报错时触发}} </script>在控制台打印里无意发现 Cannot read property ‘__route__‘ of …

Ubuntu20.04升级glibc升级及降级的心路历程

想使用pip安装Isaac Sim&#xff0c;无奈此方法只支持 GLIBC>2.34 。使用的是Ubuntu20.04&#xff0c;使用 ldd --version 查看GLIBC版本&#xff0c;如果版本低于 2.34 则需要升级GLIBC&#xff0c;基于此开始了长达一天的尝试。 请注意&#xff0c;升级GLIBC是一个危险操作…

奶龙IP联名异军突起:如何携手品牌营销共创双赢?

在快节奏的互联网消费时代&#xff0c;年轻消费群体对产品和品牌的要求越来越挑剔。因此在品牌年轻化的当下&#xff0c;一方面需要品牌自身形象也要不断追求时代感&#xff0c;另一方面品牌也需要不断引领消费者需求&#xff0c;提升竞争力和产品力。 奶龙作为近年来异军突起…

ROM修改进阶教程------安卓14去除修改系统应用后导致的卡logo验证步骤 适用安卓13 14 安卓15可借鉴参考

上期的博文解析了安卓14 安卓15去除系统应用签名验证的步骤解析。我们要明白。修改系统应用后有那些验证。其中签名验证 去卡logo验证 与可降级安装应用验证等等的区别。有些要相互结合使用。今天的博文将对修改系统应用后卡logo验证做个步骤解析。 通过博文了解💝💝�…

【Spring boot】微服务项目的搭建整合swagger的fastdfs和demo的编写

文章目录 1. 微服务项目搭建2. 整合 Swagger 信息3. 部署 fastdfsFastDFS安装环境安装开始图片测试FastDFS和nginx整合在Storage上安装nginxnginx安装不成功排查:4. springboot 整合 fastdfs 的demodemo编写1. 微服务项目搭建 版本总结: spring boot: 2.6.13springfox-boot…

Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Docker 概述 1.1 Docker 主要组成部分 1.2 Docker 安装 2.0 Docker 常见命令 2.1 常见的命令介绍 2.2 常见的命令演示 3.0 数据卷 3.1 数据卷常见的命令 3.2 常见…

三格电子-EtherNet IP转Modbus TCP网关

EtherNet/IP转Modbus TCP网关 SG-EIP-TCP-210 产品用途 SG-EIP-TCP-210 网关可以实现将 Modbus TCP 接口设备连接到 EtherNet/IP 网络中。用户不需要了解具体的 Modbus TCP 和 EtherNet/IP 协议即可实现将 Modbus TCP 设备挂载到 EtherNet/IP 接口的 PLC 上&#xff0c;并和 …

修改gitee提交时用户名密码输错导致提交失败的解决方法

1、打开控制面板&#xff0c;点击用户账户 点击管理Windows凭据 点击Windows凭据&#xff0c;找到gitee,删除后重新git push 重新输入密码即可