【Mysql优化】SQL优化最佳实践分析与总结

文章目录

      • SQL优化最佳实践分析与总结
        • 1.2.1. 避免使用 `SELECT \*`
        • 1.2.2. 小表驱动大表
        • 1.2.3. 用连接查询代替子查询
        • 1.2.4. 提升 `GROUP BY` 的效率
        • 1.2.5. 批量操作
        • 1.2.6. 使用 `LIMIT` 优化查询
      • 总结

SQL优化最佳实践分析与总结

SQL查询性能的优化是数据库设计与使用中的核心问题之一,通过以下六大实践,我们可以显著提升查询效率,降低资源消耗:


1.2.1. 避免使用 SELECT \*

原因:

  1. 查询解析成本增加SELECT * 会将字段解析为所有列,这一过程增加了解析器的负担。
  2. 覆盖索引失效SELECT * 通常无法利用覆盖索引,会导致大量回表查询,效率低下。
  3. 网络传输负担:无用字段的传输,特别是大字段 (如 TEXT) 会浪费带宽。

优化建议:

  • 明确列出所需字段,确保查询列与索引列匹配。
  • 使用工具(如 SHOW WARNINGS)检查字段映射与优化建议。

1.2.2. 小表驱动大表

原理:
在 JOIN 操作中,优化器优先使用驱动表的索引匹配被驱动表的数据。小表作为驱动表能减少扫描次数,降低磁盘读取量,提高效率。

注意点:

  • Join Buffer 限制:驱动表数据过大时,需分阶段加载,导致被驱动表扫描次数增加。
  • 优化方法:选择数据量小、索引完善的表作为驱动表。

优化示例:

  • 不推荐:SELECT * FROM scores LEFT JOIN student ON ... (大表驱动小表)
  • 推荐:SELECT * FROM student LEFT JOIN scores ON ... (小表驱动大表)

1.2.3. 用连接查询代替子查询

问题:

  • 子查询需要多次数据库查询,常依赖临时表或内存表,效率低。
  • 子查询通常无法充分利用索引。

优化方法:

  • 优先使用 JOIN 查询。
  • JOIN 查询直接利用索引,加速读取并降低资源消耗。

示例:

-- 子查询方式
SELECT name, department 
FROM student 
WHERE id IN (SELECT student_id FROM scores WHERE grade > 90);-- JOIN 查询方式(更高效)
SELECT s.name, s.department 
FROM student s 
JOIN scores sc ON s.id = sc.student_id 
WHERE sc.grade > 90;

1.2.4. 提升 GROUP BY 的效率

问题:

  • 无索引时,GROUP BY 会对全表进行排序与分组,耗时较长。

优化方法:

  1. 创建索引:在 GROUP BY 的列上添加适当索引。
  2. 优化查询:避免子查询,尝试使用 JOIN 或 EXISTS。
  3. 限制结果集:通过 LIMIT 缩小返回范围。

效果对比:

  • 无索引:SELECT remarks FROM scores GROUP BY remarks; 查询耗时:4.096秒
  • 添加索引后:耗时缩短至 0.001秒。

1.2.5. 批量操作

问题:

  • 单条插入导致多次数据库交互,性能低下。

优化建议:

  • 使用批量操作,减少数据库交互次数。
  • 每批次数据量建议控制在 500 条以内,避免单次操作过大导致数据库响应缓慢。

示例:

// 单条插入
for (Record record : records) {jdbcTemplate.update("INSERT INTO table (col1, col2) VALUES (?, ?)", record.getCol1(), record.getCol2());
}// 批量插入
String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) {Record record = records.get(i);ps.setString(1, record.getCol1());ps.setString(2, record.getCol2());}public int getBatchSize() {return records.size();}
});

1.2.6. 使用 LIMIT 优化查询

优势:

  1. 限制数据行数:避免查询超大量数据造成系统崩溃。
  2. 优化分页查询:减少不必要的全表扫描。
  3. 减轻网络负担:仅返回关心的数据行,提高传输效率。

分页示例:

-- 查询第一页,每页 10 条数据
SELECT * FROM scores ORDER BY id LIMIT 10 OFFSET 0;-- 查询第二页
SELECT * FROM scores ORDER BY id LIMIT 10 OFFSET 10;

注意:

  • 对百万级表,LIMIT 翻页会导致性能下降,推荐使用基于索引的优化方式:
-- 基于索引的分页
SELECT * FROM scores WHERE id > (SELECT id FROM scores ORDER BY id LIMIT 1 OFFSET 1000) LIMIT 10;

总结

优化 SQL 查询的核心思想是减少不必要的资源消耗,提高数据库的利用效率。通过避免全表扫描、使用合适的索引、小表驱动大表、批量操作和分页优化,可以显著提升系统性能。


博客主页: 总是学不会.

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

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

相关文章

你好Python

初识Python Python的起源 1989年,为了打发圣诞节假期,Gudio van Rossum吉多 范罗苏姆(龟叔)决心开发一个新的解释程序(Python雏形) 1991年,第一个Python解释器诞生 Python这个名字&#xff…

【Linux系统编程】:信号(2)——信号的产生

1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号,比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍,本文介绍下面三种. 2. 调用函数产生信号 2.1 k…

BlueLM:以2.6万亿token铸就7B参数超大规模语言模型

一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型,同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 :高质量语料…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

linux-----常用指令

文件和目录操作指令 ls(list)指令 功能:用于列出目录的内容,包括文件和子目录。示例: ls:列出当前目录下的所有非隐藏文件和目录。例如,在一个包含文件file1.txt、file2.txt和目录dir1的目录中&…

海外外卖APP开发新方向:基于同城外卖系统源码的多元化解决方案

时下,基于同城外卖系统源码的多元化解决方案,正成为海外外卖APP开发的新方向,推动着全球外卖市场的变革。本篇文章,小编将为大家讲述外卖APP开发的新方案。 一、同城外卖系统源码:创新与灵活的基础 同城外卖系统源码…

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT(Transient Execution )Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…

「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件

本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。 关键词 UI互动应用天气预报数据绑定动态展示状态管理 一、功能说明 自定义…

常用Python自动化测试框架有哪些?

随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了测试时间。而且由于这些框架被广泛使用,他们具有很好的健壮性&#xff0…

彻底认识和理解探索分布式网络编程中的SSL安全通信机制

探索分布式网络编程中的SSL安全通信机制 SSL的前提介绍SSL/TLS协议概述SSL和TLS建立在TCP/IP协议的基础上分析一个日常购物的安全问题 基于SSL的加密通信SSL的安全证书SSL的证书的实现安全认证获取对应的SSL证书方式权威机构获得证书创建自我签名证书 SSL握手通信机制公私钥传输…

嵌入式单片机的运行方式详解

程序的运行方式轮询系统 指的是在程序运行时,首先对所有的硬件进行初始化,然后在主程序中写一个死循环,需要运行的功能按照顺序进行执行,轮询系统是一种简单可靠的方式,一般适用于在只需要按照顺序执行的并且没有外部事件的影响的情况下。 程序的运行过程中出现如按键等需…

python如何保存.npy

数据处理的时候主要通过两个函数: (1)np.save(“test.npy”,数据结构) ----存数据 (2)data np.load(test.npy") ----取数据 给2个例子如下: 1、存列表 z [[[1, 2, 3], [w]…

gitee给DeployKey添加push权限

git执行push操作,将本地修改推送到gitee远程仓库时,报错: error: src refspec master does not match any error: failed to push some refs to gitee.com:XXX/XXX.git进一步执行以下强制推送命令: $ git push --set-upstream o…

Unbuntu下怎么生成SSL自签证书?

环境: WSL2 Unbuntu 22.04 问题描述: Unbuntu下怎么生成SSL自签证书? 解决方案: 生成自签名SSL证书可以使用OpenSSL工具,这是一个广泛使用的命令行工具,用于创建和管理SSL/TLS证书。以下是生成自签名…

Java模拟多个Mqtt客户端连接Mqtt Broker

上一次我们介绍了Java模拟单个Mqtt客户端的场景&#xff0c;但是在实际的业务场景中&#xff0c;可能需要我们模拟多个Mqtt客户端&#xff0c;比如&#xff1a;我们要对云平台的连接和设备上下行做压测。 Java模拟多个Mqtt客户端基本流程 引入Paho MQTT客户端库 <depende…

《Qt Creator 4.11.1 教程》

《Qt Creator 4.11.1 教程》 一、Qt Creator 4.11.1 概述&#xff08;一&#xff09;简介&#xff08;二&#xff09;界面构成 二、常用设置指南&#xff08;一&#xff09;环境设置&#xff08;二&#xff09;文本编辑器设置&#xff08;三&#xff09;构建和运行设置 三、构建…

LeetCode 热题 100_K 个一组翻转链表(31_25_困难_C++)(四指针法)

LeetCode 热题 100_K 个一组翻转链表&#xff08;31_25&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;四指针法&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;四指针法&#x…

探索 Python编程 调试案例:计算小程序中修复偶数的bug

在 学习Python 编程的过程里&#xff0c;会遇到各种各样的bug。而修复bug调试代码就像是一场充满挑战的侦探游戏。每一个隐藏的 bug 都是谜题&#xff0c;等待开发者去揭开真相&#xff0c;让程序可以顺利运行。今天&#xff0c;让我们通过一个实际案例&#xff0c;深入探索 Py…

harmony UI组件学习(1)

Image 图片组件 string格式&#xff0c;通常用来加载网络图片&#xff0c;需要申请网络访问权限:ohos.permission.INTERNET Image(https://xxx.png) PixelMap格式&#xff0c;可以加载像素图&#xff0c;常用在图片编辑中 Image(pixelMapobject) Resource格式&#xff0c;加…

TCL发布万象分区,再造Mini LED技术天花板

作者 |辰纹 来源 | 洞见新研社 现实世界中&#xff0c;光通过悬浮在大气中的冰晶折射&#xff0c;呈现出环形、弧形、柱形或亮点的扩散&#xff0c;从而产生光晕&#xff0c;雨后的彩虹是我们经常能看到的光晕现象。 然而&#xff0c;当光晕出现在电视中&#xff0c;那就不是…