SQL最佳实践(笔记)

news/2025/2/13 22:48:15/

写在前面:

之前baeldung的Java Weekly Reviews里面推荐了一篇关于SQL优化的文章,正好最近在学习数据库相关知识,记一些学习笔记

原文地址:SQL Best Practices Every Java Engineer Must Know

1. 使用索引

使用索引可以让数据库快速定位和访问数据,从而显著提升查询效率。

具体可以见:数据库学习笔记(一、索引)

简单总结就是索引采用高效数据结构有序存储数据,能简化查询路径,让数据库直接定位目标,减少磁盘 I/O 操作,从而提高查询效率。

TIPS:

  • 在经常被 WHERE, JOIN, ORDER BY 和 GROUP BY 子句使用的列上添加索引
  • 使用覆盖索引来包含查询所需的所有列 (例如,如果有一个查询 SELECT col1, col2 FROM table WHERE col3 = 'value',那么可以创建一个包含 col3col1 和 col2 的复合索引)

       ⚠️ 过度使用索引会导致 写入性能下降 并且创建索引需要 额外存储空间

  • 利用基于函数的索引
sql">CREATE INDEX idx_upper_last_name ON employees (UPPER(last_name));
SELECT * FROM employees WHERE UPPER(last_name) = 'SMITH';

适用场景:

  • 需要经常根据经过转换的列值进行搜索(例如使用 UPPER、LOWER、子字符串操作等)。
  • 需要对计算值或表达式创建索引。
  • 想优化涉及日期 / 时间操作的查询。

❗与在 Java 中执行相同操作相比,在处理大量数据时,在数据库中使用基于函数的索引或表达式索引通常会更高效。

⚠️基于函数的索引或表达式索引也会增加存储需求,并减慢数据修改操作的速度。

2. 避免使用 SELECT * 

SELECT * 需要检索表格中的所有列,会降低效率并导致不必要的数据传输

3. 正确使用 JOIN

  • 使用 INNER JOIN 来获取两个表中匹配的行。
  • 使用 LEFT JOIN 来包含左表中的所有行以及右表中匹配的行。

避免使用如下的查询:

sql">SELECT u.name, o.order_date
FROM users u, orders o
WHERE u.id = o.user_id;

4. 使用 LIMIT 限制返回的行数

如果不需要使用所有的数据,可以使用 LIMIT 限制返回的行数。(在分页场景可以使用)

sql">SELECT name, email FROM users WHERE active = true LIMIT 10;

5. 避免 WHERE 子句中使用函数

可能会导致索引失效,从而降低查询效率

6. 优化 JOIN 查询

  • 确保连接条件中使用的列已经建立索引
  • 连接多个表时从最小的表开始


http://www.ppmy.cn/news/1571814.html

相关文章

vite创建的react18的@路径提示配置

1.配置vite.config.ts import { defineConfig } from "vite"; import react from "vitejs/plugin-react"; import path from "path"; export default defineConfig({plugins: [react()],resolve: {alias: {"": path.resolve(__dirnam…

【k8s应用管理】kubernetes Pod控制器

文章目录 Kubernetes Pod 控制器概述DeploymentStatefulSetStatefulSet 核心特性StatefulSet 组成创建 StatefulSet 的步骤配置 NFS 存储(示例)定义 PV 资源创建 StatefulSet应用配置 验证与操作查看资源状态测试 DNS 解析滚动更新扩展与缩容 与 Deploym…

Conda 包管理:高效安装、更新和删除软件包

Conda 包管理:高效安装、更新和删除软件包 1. 引言 在使用 Anaconda 进行 Python 开发时,包管理是日常操作的核心内容。Conda 提供了一整套高效的工具来管理 Python 环境中的软件包,避免了版本冲突,并确保了环境的一致性。 本篇…

C# 上位机--常量

引言 在 C# 上位机开发过程中,常量是一个基础且重要的概念。合理使用常量可以提高代码的可读性、可维护性和安全性。本文将深入探讨 C# 上位机中常量的定义、使用场景以及相关的示例程序,并通过图文结合的方式让读者更直观地理解常量的作用。 一、什么…

Apache Kafka 中的认证、鉴权原理与应用

编辑导读:本篇内容将进一步介绍 Kafka 中的认证、鉴权等概念。AutoMQ 是与 Apache Kafka 100% 完全兼容的新一代 Kafka,可以帮助用户降低 90%以上的 Kafka 成本并且进行极速地自动弹性。作为 Kafka 生态的忠实拥护者,我们也会持续致力于传播 …

网络安全抑制 缓解 根除 恢复 网络安全如何解决

一、网络安全 网络是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断。 二、如何防范网络安全问题 1、防范网络病毒。 2、配置防火墙。 3、采…

Unity URP的2D光照简介

官网工程,包括2d光照,动画,动效介绍: https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…

jenkins手动安装插件

现象:有些时候因为网络问题或者因为版本问题下载不了或使用不了,我们可以在插件市场选择合适的版本手动安装。 确认jenkins版本 我们可以在jenkins页面右下角看到具体版本,为了选择相应版本插件 选择插件 我这里想要安装的是ThinBackup插…