sql优化(1)

SQL优化很重要,能提高性能,减少查询执行时间,在处理大量数据或高并发场景时可以快速返回结果,提升系统吞吐量,节省资源,降低服务器CPU、内存和I/O的负载。

GROUP BY优化


GROUP BY子句用于将查询结果按照一个或多个列进行分组,在数据分析和报表生成等场景中经常使用。然而,如果使用不当,可能会导致查询性能下降,优化GROUP BY操作可以显著提高查询的执行速度,减少资源消耗,尤其是在处理大规模数据集时。
 
GROUP BY优化策略
 
过滤数据
 
在GROUP BY之前,先使用WHERE子句过滤掉不需要的数据。例如,有一个销售数据表(sales),包含字段销售日期(sale_date)、产品名称(product_name)、销售数量(quantity)和销售金额(amount),如果我们只想统计2024年特定产品的销售总额,就可以这样写查询:

SELECT product_name, SUM(amount) 
FROM sales
WHERE sale_date BETWEEN '2024-01-01' AND '2024 - 12 - 31'
GROUP BY product_name;

这样,只有符合日期范围的销售记录才会参与分组和求和操作,减少了数据处理量。
 
利用索引
对于GROUP BY的列,创建索引可以加快分组操作,例如,在上述销售数据表中,如果经常按照产品名称分组统计,那么可以为product_name字段创建索引:

CREATE INDEX idx_product_name ON sales (product_name);

 当执行GROUP BY product_name操作时,数据库可以利用这个索引来快速定位和分组具有相同产品名称的数据,而不是扫描整个表。
 
尽量让查询使用索引覆盖,如果GROUP BY和聚合函数所需要的列都在索引中,数据库可以直接从索引中获取数据,而不需要访问表数据。例如,有一个索引包含了product_name和amount两个字段,查询只需要这两个字段的信息进行分组求和:

SELECT product_name, SUM(amount) 
FROM sales
WHERE...
GROUP BY product_name;

这种情况下,数据库可以直接从索引中获取数据进行分组和求和,避免了额外的表数据读取操作,大大提高了查询性能。

优化分组列顺序

按照选择性高(即不同值数量较多)到选择性低的顺序排列分组列。例如,有一个学生成绩表(grades),包含学生姓名(student_name)、班级(class)和成绩(score),如果要统计每个班级中每个学生的平均成绩,并且班级数量远少于学生数量,应该先按照班级分组,再按照学生姓名分组:

SELECT class, student_name, AVG(score) 
FROM grades
GROUP BY class, student_name;

这样的顺序可以让数据库在分组过程中更快地划分数据,减少不必要的中间分组步骤。

通过这些优化策略,GROUP BY操作的查询性能可以得到显著提高,使得数据分析等任务能够更加高效地完成。

LIMIT优化

当处理大型数据集时,不加优化地使用LIMIT可能会导致数据库执行大量不必要的操作,优化LIMIT可以减少数据读取量和计算量,从而加快查询速度,节省服务器资源,并且能够更快地将结果反馈给用户,提升用户体验,尤其是在网页应用中的分页功能等场景下,高效的LIMIT优化可以使页面加载更加迅速。

LIMIT优化策略

利用有序索引

如果查询是按照某个列排序后取前几条记录,并且这个列有索引,那么数据库可以直接利用索引来快速定位记录。例如,在一个产品销售表(sales)中有销售日期(sale_date)和销售额(amount)字段,并且为sale_date创建了索引。如果要获取最近销售的前10笔订单,可以这样写查询:

SELECT * FROM sales ORDER BY sale_date DESC LIMIT 10;

数据库可以通过索引快速定位到最近的销售日期对应的记录,而不需要扫描整个表,因为索引本身是按照一定顺序存储的,在这种情况下,按照销售日期倒序排列的索引可以帮助快速找到最前面的10条记录。

复合索引的使用
对于包含多个列的复合索引,也可以利用其顺序来优化LIMIT。假设在一个员工信息表(employees)中有员工入职日期(hire_date)、部门(department)和薪资(salary)字段,并且有一个复合索引(hire_date, department)。如果要获取某个部门中最早入职的前5名员工,可以这样写查询:

SELECT * FROM employees WHERE department = 'IT' ORDER BY hire_date LIMIT 5;

数据库可以利用复合索引先按照入职日期找到符合部门条件的最早入职的员工记录,提高查询效率。
 
避免全表扫描:
 在应用LIMIT之前,通过WHERE子句等条件筛选来减少参与LIMIT操作的数据量。例如,在一个订单表(orders)中有订单日期(order_date)、订单状态(order_status)和客户区域(customer_region)等字段。如果只想获取某个区域(如“华东地区”)未完成订单中的前20条,可以这样写查询:

SELECT * FROM orders
WHERE customer_region = '华东地区' AND order_status!= '已完成'
ORDER BY order_date DESC LIMIT 20;

通过WHERE子句提前过滤掉了不符合条件的订单,使得参与LIMIT操作的数据量大大减少,避免了对整个订单表进行扫描。

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

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

相关文章

人工智能知识分享第六天-机器学习_​逻辑回归(Logistic Regression)

简介 在机器学习中,分类问题是一种常见的任务,目标是根据输入特征将数据点分配到不同的类别中。为了实现分类,我们需要训练一个分类器,该分类器能够根据输入数据的特征进行预测。 逻辑回归(Logistic Regression&…

OpenCV-Python实战(11)——边缘检测

一、Sobel 算子 通过 X 梯度核与 Y 梯度核求得图像在,水平与垂直方向的梯度。 img cv2.Sobel(src*,ddepth*,dx*,dy*,ksize*,scale*,delta*,borderType*)img:目标图像。 src:原始图像。 ddepth:目标图像深度,-1 代表…

Docker- Unable to find image “hello-world“locally

Docker- Unable to find image “hello-world“locally 文章目录 Docker- Unable to find image “hello-world“locally问题描述一. 切换镜像1. 编辑镜像源2. 切换镜像内容 二、 检查设置1、 重启dockers2、 检查配置是否生效3. Docker镜像源检查4. Dokcer执行测试 三、自定义…

【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件

步骤 1. 新建一个Actor类,这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下,其中第16行代码用于构建配…

互慧-急诊综合管理平台 ServicePage.aspx 任意文件读取漏洞复现

0x01 产品简介 互慧急诊急救快速联动平台,是用于管理门诊急诊病人的系统,主要包括门诊急诊业务和急诊物资管理两部分,其中门诊急诊业务主要包括院前急救、院内抢救、留观监护、绿色通道、预检分诊等;急诊物资管理包括急诊药品管理、急诊设备管理、抢救车管理、急救箱管理、…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(五)

****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 五、 解释评估(Explanation Evaluation) 在前面的章节中,我们介绍了不同的解释技术和它们的用途&#…

pyside6-deploy 提示相对路径错误

Pyside6.5的nuitka_helper.py中的 qml_args.extend([f"--include-data-files{qml_file}./{qml_file.relative_to(source_file.parent)}"for qml_file in qml_files])在qml_file为相对路径的时候会报错。通过增加resolve()来强制转为绝对路径

Echart实现3D饼图示例

在可视化项目中,很多地方会遇见图表;echart是最常见的;这个示例就是用Echart, echart-gl实现3D饼图效果,复制即可用 //需要安装,再引用依赖import * as echarts from "echarts"; import echar…

Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验

一,BSP工程管理 定义:是为了模块化整理代码,相同属性的文件存放在同一个目录下。 ①先mkdir多个文件夹er ②把共同.h文件转移到指定文件夹下 二,启动文件 .global _start /* 全局标号 *//** 描述: _start函数&am…

vue使用vue-seamless-scroll进行轮播滚动展示内容

我这里只是记录下一些基本的东西,具体大家可以查看官网介绍,有更详细的使用文档(目前有vue和js版本): https://chenxuan0000.github.io/vue-seamless-scroll/zh/ 安装组件: npm install vue-seamless-scro…

HTML——58.value和placeholder

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>value和placeholder属性</title></head><body><!--input元素的type属性&#xff1a;(必须要有)1.指定输入内容的类型2.默认为text,单行文本框-->&l…

C语言面的向对象编程(OOP)

如果使用过C、C#、Java语言&#xff0c;一定知道面向对象编程&#xff0c;这些语言对面向对象编程的支持是语言级别的。C语言在语言级别不支持面向对象&#xff0c;那可以实现面向对象吗&#xff1f;其实面向对象是一种思想&#xff0c;而不是一种语言&#xff0c;很多初学者很…

使用C#构建一个论文总结AI Agent

前言 我觉得将日常生活中一些简单重复的任务交给AI Agent&#xff0c;是学习构建AI Agent应用一个很不错的开始。本次分享我以日常生活中一个总结论文的简单任务出发进行说明&#xff0c;希望对大家了解AI Agent有所帮助。任务可以是多种多样的&#xff0c;真的帮助自己提升了…

vs 2022 中xml 粘贴为Class 中,序列化出来的xml 的使用

上图是visual studio 2022 中使用的粘贴功能的菜单位置 在生成的xml 中&#xff0c;有些是类似如下类型的 [System.Serializable] [System.Xml.Serialization.XmlType] public class Item {private bool isVisibleField;private bool isVisibleFieldSpecified;[System.Xml.Se…

代际超越:方太冰箱勾勒“蛙跳模型”轮廓

文&#xff1a;互联网江湖 作者&#xff1a;志刚 每一代人&#xff0c;都有其独特的新需求、新创造和新使命。 曾经的手机领域&#xff0c;苹果以其革命性创新颠覆了诺基亚的塞班系统&#xff0c;惊艳了整个行业。而如今&#xff0c;华为凭借其三折叠和自主研发的鸿蒙系统&am…

spring-boot启动源码分析(二)之SpringApplicationRunListener

在上一篇《spring-boot启动源码分析&#xff08;一&#xff09;之SpringApplication实例构造》后&#xff0c;继续看了一个月的Spring boot启动源码&#xff0c;初步把流程看完了&#xff0c;接下来会不断输出总结&#xff0c;以巩固这段时间的学习。同时也希望能帮到同样感兴趣…

Linux-Redis哨兵搭建

环境资源准备 主机名IP端口号角色vm1192.168.64.156379/26379mastervm2192.168.64.166379/26379slavevm3192.168.64.176379/26379slave 6379为redis服务暴露端口号、26379为sentinel暴露端口号。 安装Redis # 包文件下载 wget https://github.com/redis/redis/archive/7.2.2…

MySQL 03 章——基本的SELECT语句

一、SQL概述 &#xff08;1&#xff09;SQL背景知识 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是使用关系模型的数据库应用语言&#xff0c;与数据直接打交道不同的数据库管理系统生产厂商都支持SQL语句&#xff0c;但都有特有内容 …

[羊城杯 2024]1z_misc

得到FL4G.zip和天机不可泄露.txt文件&#xff0c;其中压缩包需要解压密码&#xff1a; 二十八星宿&#xff1a; 东方苍龙七宿&#xff1a;角、亢、氐、房、心、尾、箕 南方朱雀七宿&#xff1a;鬼、井、柳、星、张、翼、轸 西方白虎七宿&#xff1a;奎、娄、胃、昴、毕、觜、…

QT----------多媒体

实现思路 多媒体模块功能概述&#xff1a; QT 的多媒体模块提供了丰富的功能&#xff0c;包括音频播放、录制、视频播放和摄像头操作等。 播放音频&#xff1a; 使用 QMediaPlayer 播放完整的音频文件。使用 QSoundEffect 播放简短的音效文件。 录制音频&#xff1a; 使用 QMe…