首页 > 数据库 >SQL 查询优化思路(行为表 t1 与业绩表 t2 关联):

SQL 查询优化思路(行为表 t1 与业绩表 t2 关联):

时间:2024-09-22 08:50:33浏览次数:1  
标签:JOIN t2 查询 SQL t1 行为 id

语句实例(行为表 t1 与业绩表 t2 关联):

with t as (
	select 行为id , 
    	t1.行为时间 ,
        t2.用户id , 
        t2.业绩时间 ,
    	row_number() over(partition by t1.用户id order by t1.行为时间 desc) as rnk
    from 行为表 t1 
    join 业绩表 t2 on t1.用户id = t2.用户id and t1.行为时间 < t2.业绩时间
)

select t.行为id , t.行为时间 ,t.用户id, t.业绩时间 from t where t.rnk = 1

1、索引的优化

创建合适的索引
1-1、对 行为表 和 业绩表 中的 用户id 列创建索引,以提高 JOIN 操作的效率。

1-2、对 行为时间 和 业绩时间 列创建索引,以优化条件过滤和排序

1-3、如果查询中经常包含其他筛选条件(如 t1.行为时间 < t2.业绩时间),可以考虑使用复合索引,如 (用户id, 行为时间) 和 (用户id, 业绩时间)。

2、减少数据量

限制扫描范围
在 行为时间 和 业绩时间 之前进行过滤时,如果可以在 JOIN 前减少数据量,将大大提高性能。

SELECT t1.行为id, t1.行为时间, t2.用户id, t2.业绩时间
FROM 行为表 t1
JOIN 业绩表 t2
  ON t1.用户id = t2.用户id
 AND t1.行为时间 < t2.业绩时间
WHERE t2.业绩时间 > '2024-01-01';

3、减少冗余计算

3-1、避免不必要的列
在查询中只选择必要的列,避免返回不需要的列,尤其是在使用 SELECT * 时,会增加不必要的开销。
3-2、减少子查询
减少不必要的嵌套子查询或重复计算,可以通过 WITH 子句(CTE)或者窗口函数来减少计算量。

4、使用窗口函数

利用 ROW_NUMBER()、RANK() 等窗口函数可以高效地为每个用户排序并筛选出所需的数据。特别是结合 PARTITION BY 和 ORDER BY,可以减少复杂的聚合操作。

5、分区表

如果数据量非常大,可以考虑对表进行 分区(如按日期或用户 ID 分区),这样在执行查询时只需要扫描相关的分区,减少了全表扫描的开销。

6、批量操作

减少单次操作的数据量
如果你处理的数据量非常大,建议分批处理数据。通过将查询分成多个小批次执行,减少单次查询的负载,避免内存压力过大。

7、避免使用过多的 DISTINCT

如果查询结果不要求绝对去重,尽量避免使用 DISTINCT。DISTINCT 需要额外的排序步骤,会增加计算开销。

8、使用合适的 JOIN 类型

根据业务逻辑,选择合适的 JOIN 类型。避免使用不必要的 LEFT JOIN 或者 FULL JOIN

9、分析 SQL 执行计划

使用 EXPLAIN 分析 SQL 执行计划:
通过 EXPLAIN 查看数据库如何执行查询。你可以看到是否有全表扫描、是否使用了索引、关联操作的顺序等。根据这些信息,进一步调整查询。

EXPLAIN 
SELECT t1.行为id, t1.行为时间,t2.用户id, t2.业绩时间
FROM 行为表 t1
JOIN 业绩表 t2
  ON t1.用户id = t2.用户id
 AND t1.行为时间 < t2.业绩时间;

10、并行查询

如果数据库支持并行查询(如 PostgreSQL 或 Oracle 等),可以利用多核处理器加快大数据量查询的执行时间

总结:

1、创建合适的索引,尤其是对于 用户id、行为时间 和 业绩时间 列进行单列或复合索引优化。
2、在 JOIN 之前减少数据量,通过过滤条件限制行为表中的数据行。
3、使用窗口函数优化排序和分组,避免过多的嵌套查询。
4、分析执行计划,调整索引、过滤条件及 JOIN 顺序,减少全表扫描。

标签:JOIN,t2,查询,SQL,t1,行为,id
From: https://www.cnblogs.com/qingtianyu2015/p/18424853

相关文章

  • CTF-PWN-ret2shellcode全解
    ##入门级shellcode在平时遇到题目时候我们第一步查看保护,然后再根据反汇编的程序进行判断程序能够用哪种攻击方法入门级的shellcode肯定就是简单的看,但是那种无限制且可以直接执行的就不给大家讲了,那种是非常非常简单的了,首先给大家看一个例题:源码:保护:有新手会问,开启了nx......
  • MySQL学习
    一、Ubuntu环境下安装MySQL关于在Ubuntu22下安装MySQL5.7,我主要参考的是下面这几篇博客:Ubuntu22部署MySQL5.7详细教程_ubuntu22安装mysql5.7-CSDN博客Ubuntu安装和使用MySQL_奉君逍遥-CSDN开发云在配置文件中设置默认编码格式与存储引擎。打开配置文件sudovim/etc/mysql/mysql.c......
  • 基于SpringBoot+Vue+MySQL的手机销售管理系统
    系统展示用户前台界面管理员后台界面商家后台界面系统背景  随着智能手机的普及和市场竞争的日益激烈,手机销售行业面临着前所未有的挑战与机遇。传统的手工记录和简单的电子表格管理方式已难以满足现代手机销售业务的需求,销售数据的混乱和管理效率低......
  • 基于SpringBoot+Vue+MySQL的国产动漫网站
    系统展示用户前台界面管理员后台界面系统背景  随着国内动漫产业的蓬勃发展和互联网技术的快速进步,动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而,市场上现有的动漫平台大多以国外动漫为主,对国产动漫的推广和展示存在不足。为了填补这一空白......
  • 在Linux下安装MySQL
    摘要在学习MySQL语法之前,我们需要先解决在Ubuntu或CentOs环境下的“软件安装”的问题。本文梳理了安装前后的各个步骤及有关的注意事项,主要涵盖了安装前的准备工作、如何安装mysql,以及安装之后如何启动、如何正式使用这几个方面。建议读者先浏览一遍,留心相关的注意事项,或许能令自......
  • SQL 语法学习详细指南
    SQL(StructuredQueryLanguage,结构化查询语言)是一种用于管理和操作关系数据库的标准语言。无论是在数据分析、软件开发还是数据库管理中,SQL都扮演着至关重要的角色。本详细指南将系统地介绍SQL的基本语法和常用操作,涵盖数据查询、数据操作、数据定义和数据控制等关键方面。S......
  • 【力扣 | SQL题 | 每日三题】力扣175, 176, 181
    1.力扣175:组合两个表1.1题目:表: Person+-------------+---------+|列名|类型|+-------------+---------+|PersonId|int||FirstName|varchar||LastName|varchar|+-------------+---------+personId是该表的主键(具有唯一......
  • MySQL数据库概述与基础
    存储数据的方式在数据库领域,存储数据的方式多种多样,主要包括以下几种:变量和列表:变量:在编程语言中用于存储单个数据项。列表(或数组):用于存储一系列有序的数据项。文件:将数据以文本或二进制形式存储在文件中,如CSV、JSON、XML等格式。数据库:数据库是专门用于存储、......
  • MySQL查询第M条到第N条数据(M<N)
    在MySQL中查询第M条到第N条数据是一个常见的需求,通常用于分页显示数据或者在需要展示一定范围内的记录时。下面将介绍如何使用SQL语句来实现这一点,并提供具体的示例。基本原理要在MySQL中查询第M条到第N条数据,可以利用LIMIT和OFFSET子句。OFFSET指定从......
  • 【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统
    Github项目地址:https://github.com/fecommunity/easy-blog,欢迎Star。Easy-BlogEasy-Blog是一套集成文章发表、页面创建、知识库管理、博客后台管理等功能于一体的博客系统。首页-浅色主题首页-暗黑主题文章阅读后台管理✨特性......