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

SQL最佳实践(笔记)

写在前面:

之前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 的复合索引)

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

  • 利用基于函数的索引
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 来包含左表中的所有行以及右表中匹配的行。

避免使用如下的查询:

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

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

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

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

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

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

6. 优化 JOIN 查询

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


http://www.kler.cn/a/542110.html

相关文章:

  • 编译和链接【三】
  • C++11新特性之weak_ptr智能指针
  • SpringBoot 统一功能处理之拦截器、数据返回格式、异常处理
  • 查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串
  • JVM做GC垃圾回收时需要多久,都由哪些因素决定的
  • 解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用
  • 国产编辑器EverEdit - 批量替换功能
  • 【CXX-Qt】1.1 Rust中的QObjects
  • 2025全新JSP简约博客平台-免费开源
  • deepseek+“D-id”或“即梦AI”快速生成短视频
  • React 中级教程
  • zsh: command not found: conda
  • [Linux] 信号(singal)详解(二):信号管理的三张表、如何使用coredump文件、OS的用户态和内核态、如何理解系统调用?
  • Odoo17 0.1常见的QWeb 模板语言指令的详细总结
  • 【魔法阵——广义Dijkstra,DP】
  • 【Jetpack Compose】Color.kt 文件左侧没有显示颜色解决方法
  • Maven 版本管理与 SNAPSHOT 详解
  • C#上位机--Net Framework
  • GitHub Pages + Jekyll 博客搭建指南(静态网站搭建)
  • 5.7.2 进度管理
  • 【鸿蒙开发】第二十四章 AI -Natural Language Kit(自然语言理解服务)
  • SLF4J与Spring集成实战:替代JCL并绑定Log4j
  • 将Markdown格式文件与word文件相互转化方法
  • 【5】阿里面试题整理
  • STM32 软件SPI读写W25Q64
  • 论文笔记-CIKM2023-GALORE