sql优化方法

基础优化方法
1.使用索引,在创建索引时,需要考虑查询的频率和数据的更新频率,避免过度索引或不必要的索引。
2.尽量避免使用SELECT *,而是明确指定需要查询的字段。这样可以减少返回的数据量,提高查询效率。

优化查询条件
1.在查询数据时,尽量使用WHERE子句对数据进行过滤,减少返回的数据量。
2.使用索引覆盖查询
索引覆盖查询是指查询的字段都包含在索引中,不需要回表查询数据。这样可以减少IO操作,提高查询效率。
3.避免在WHERE子句中使用函数
在WHERE子句中使用函数会导致索引失效,需要全表扫描。
4.使用合适的数据类型
选择合适的数据类型可以减少存储空间和查询时间,提高数据库性能。

连接查询优化
1.使用INNER JOIN代替WHERE子句连接

-- 不推荐
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
-- 推荐
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

联表查询(也称为多表查询)在没有正确指定连接条件的情况下,确实会导致笛卡尔积(Cartesian product)的情况。笛卡尔积是两个集合中所有可能的有序对的集合,而在数据库查询中,它指的是两个或多个表中的每一行都与另一个表中的每一行组合。

当你使用SELECT * FROM table1, table2这样的语法时,你实际上是在告诉数据库你想看到table1和table2的笛卡尔积,除非你在WHERE子句中指定了连接条件来限制结果集。

例如,如果table1有3行,而table2有4行,那么没有连接条件的查询将返回12行结果(3乘以4)。

但是,当你使用INNER JOIN(或LEFT JOIN、RIGHT JOIN、FULL JOIN等)并指定了连接条件时,数据库只会返回满足该条件的行组合。

2.在连接查询时,尽量使用JOIN ON对连接进行过滤,而不是在WHERE子句中过滤连接。

-- 不推荐
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.idWHERE table2.name = 'value';-- 推荐
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id 
AND table2.name = 'value';

3.根据实际业务需求选择合适的连接类型,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

子查询优化
1.使用EXISTS代替IN
在使用子查询时,尽量使用EXISTS代替IN,EXISTS只关心是否存在记录,而IN会将子查询的结果集加载到内存中,可能导致性能问题。

-- 不推荐
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);-- 推荐
SELECT * FROM table1 WHERE EXISTS(SELECT 1 FROM table2 WHERE table1.id = table2.id);

IN和EXISTS的区别和使用
in()适合子表比主表数据小的情况
exists()适合子表比主表数据大的情况
当主表数据与子表数据一样大时,in与exists效率差不多,可任选一个使用

in的性能分析

select * from A
where id in(select id from B)

sql会先执行括号内的子查询,再执行主查询
0、当前的in子查询是B表驱动A表
1、mysql先将B表的数据一把查出来置于内存中
2、遍历B表的数据,再去查A表(每次遍历都是一次连接交互,这里会耗资源)
3、假设B有100000条记录,A有10条记录,会交互100000次数据库;再假设B有10条记录,A有100000记录,只会发生10次交互。

Exists的性能分析

select a.* from A a
where exists(select 1 from B b where a.id=b.id)

0、当前exists查询是A表驱动B表
1、与in不同,exists将A的纪录数查询到内存,因此A表的记录数决定了数据库的交互次数
2、假设A有10000条记录,B有10条记录,数据库交互次数为10000;假设A有10条,B有10000条,数据库交互次数为10。

2.使用JOIN代替子查询
在查询中使用JOIN可以更好地表达查询的逻辑,避免使用复杂的子查询。

-- 不推荐
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);-- 推荐
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

LIMIT优化
1.在查询大量数据时,使用LIMIT可以限制返回的记录数,避免查询过多的数据。

排序优化
1.通常应该选择已经建立了索引的字段进行排序,避免对大量数据进行排序操作。
2.如果查询中只需要排序字段,并且该字段已经建立了索引,可以使用覆盖索引来减少排序的时间。

避免使用通配符
1.在查询数据时,尽量避免使用%通配符在查询字段的开头,这会导致索引失效,需要进行全表扫描。
2.如果需要在查询中使用通配符%在字段的结尾,可以使用前缀索引来优化查询性能。

联合查询优化
1.使用UNION ALL代替UNION
在使用联合查询时,如果不需要去重操作,应该使用UNION ALL,可以减少查询的开销。

-- 不推荐
SELECT * FROM table1 WHERE condition
UNION
SELECT * FROM table2 WHERE condition;-- 推荐
SELECT * FROM table1 WHERE condition
UNION ALL
SELECT * FROM table2 WHERE condition;

2.使用EXISTS代替IN和UNION
在查询中使用EXISTS代替IN和UNION,可以更好地表达查询逻辑,提高查询性能。

-- 不推荐
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2 WHERE condition)
UNION
SELECT * FROM table1 WHERE id IN (SELECT id FROM table3 WHERE condition);-- 推荐
SELECT * FROM table1 WHERE EXISTS(SELECT 1 FROM table2 WHERE table1.id = table2.id AND condition)
OR EXISTS (SELECT 1 FROM table3 WHERE table1.id = table3.id AND condition);

数据表设计优化
1.使用合适的数据类型

在创建数据表时,选择合适的数据类型可以减少存储空间和查询时间,提高数据库性能。

-- 不推荐
CREATE TABLE table_name (id VARCHAR(100), name VARCHAR(100));-- 推荐
CREATE TABLE table_name (id INT, name VARCHAR(100));

2.垂直拆分表

在数据表中包含大量冗余数据时,可以考虑对表进行垂直拆分,将不同的数据拆分到不同的表中,提高查询性能。

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

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

相关文章

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼

在互联网时代,App推广和运营面临着前所未有的挑战。流量红利逐渐衰退,用户获取成本不断攀升,如何确保在多变的互联网环境下,迅速搭建起能时刻满足用户需求的运营体系,成为众多企业急待解决的问题。今天,我们…

docker部署FastDFS整合Springboot

文章目录 1、FastDFS是什么?2、搭建docker环境3、部署fastdfs4、整合springboot5、接口测试参考文章 1、FastDFS是什么? FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式,以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具: 聚星文社 字数统计工具:使用字数统计工具,如Microsoft Word或在线字数统计器,来确保你…

[JS]对象

介绍 对象是一种无序的数据集合, 可以详细的描述某个事物 事物的特征在对象中用属性来表示, 事物的行为在对象中用方法来表示 使用 创建对象 let 对象名 {属性名:值,方法名:函数, } let 对象名 new Object(); 对象名.属性…

【MySQL】记一次 SQL 优化

1 背景 我们的数据库中配置了一套慢 SQL 的监控(这里存在 SQL 本身不慢, 但是触发某些场景, 比如 filesort 等也会被采集), 会不定时的输出一批需要排查的 SQL, 下面挑了几条比较有意思的进行分享。 2 table_1 表结构: CEATE TABLE table_1 (column_1,column_2,column_3,co…

工业网关的功能与作用解析-天拓四方

在工业4.0和智能制造的时代背景下,工业网关作为连接现场设备与云端平台的桥梁,正发挥着日益重要的作用。它不仅为工业设备的远程监控和管理提供了可能,还为企业实现数字化转型和智能化升级提供了有力支持。本文将对工业网关的功能与作用进行解…

Python:基于TSFEL库对时间序列进行特征分析

1. TSFEL 时间序列作为主要TSFEL提取方法的输入传递,要么作为先前加载在内存中的数组传递,要么存储在数据集中的文件中。 由于TSFEL可以处理多维时间序列,因此随后应用了一套预处理方法,以确保信号质量足够和时间序列同步&#xf…

AI音乐大模型:深度剖析创意与产业的双重变革

随着AI技术的飞速发展,音乐大模型在最近一个月内纷纷上线,这一变革性技术不仅颠覆了传统的音乐创作方式,更是对整个音乐产业及创意产业带来了深远的影响。本文将从多个维度出发,深度剖析AI音乐大模型对创意与产业的双重变革。 一、…

ONLYOFFICE 8.1:引领桌面办公新潮流,功能升级全面提升

目录 一、ONLYOFFICE是什么? 二、功能完善的PDF编辑器 三、幻灯片版式升级 四、改进从右至左显示 五、新的本地化选项 六、多媒体功能增强 七、应用价值探讨 一、ONLYOFFICE是什么? ONLYOFFICE 是一款功能强大的办公套件,旨在提供全面…

acme.sh泛证书申请

说明: 1、想每个项目都接入域名+端口访问,所以通过acme.sh申请泛域名证书 2、阿里云域名解析,并且指定公网ip地址对应的公共Nginx服务 3、acme.sh证书只有3个月,所以要用shell自动续签证书 4、阿里云域名已解析,所以二级域名、三级域名能正常解析,如下图所示, 一、阿里云…

charles破解

一、Charles官网下载安装包二、安装charles三、charles破解 一、Charles官网下载安装包 根据自己电脑系统 官网下载即可。 链接: https://www.charlesproxy.com/download/latest-release/ 二、安装charles 点击下载的安装包,然后进行安装。 三、charles破解 打…

【认识3D打印技术:如何走进你的生活】

知名苹果产品分析师郭明錤透露,Apple Watch Series 10从今年下半年开始采用由3D打印技术生产的部件。苹果在去年的Apple Watch Series 9上曾试验过3D打印部件,但并没有大规模量产,而在经过大量的测试之后,3D打印大规模生产的效率似…

服务器如何实现SSH免密码登录?

目录 一、服务器和电脑的区别二、什么是SSH三、什么是免密码登录四、服务器如何实现SSH免密码登录 一、服务器和电脑的区别 服务器和电脑是两种不同类型的计算机系统,它们在设计、功能和用途上存在明显的区别。首先,从硬件配置上看,服务器通…

202406240944_数组知识总结

202406240944_数组知识总结 ✏随笔数组理论知识语法回顾C length()、size()、sizeof()三者的区别 (Weather::上海 ⛅多云,23~30℃ 良 冷风徐徐🌬️) ✏随笔 数组理论知识 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是从0开始的。 …

MySQL学习(3):SQL语句之DDL

1.SQL通用语法与分类 (1)通用语法 (2)分类 2.DDL 2.1数据库操作 show DATABASES; #查询所有数据库select DATABASE(); #查询当前数据库create DATABASE 数据库名称 [default charest 字符集] [collate 排列规则]; #default cha…

时序分析(二):input delay分析

一、IO接口分析基本模型 数据按照同步方式可分为系统同步和源同步方式两种。所谓系统同步指发送端和接收端共用一个时钟源;源同步指发送端提供数据同步时钟,接收端根据该时钟进行数据接收。现在多数通信中使用源同步方式,例如以太网、ADC等。…

游戏开发中常用Api

文章目录 Windows PowerShell1.PowerShell的执行策略 Git_Api1.初始化仓库2.设置全局邮箱和用户名3.ssh相关操作3.1.检查是否存在ssh3.2.生成ssh3.3.测试和仓库的ssh连接 4.与远程仓库的操作4.1.连接远程仓库4.2.取消连接4.3.拉取代码4.4.提交相关 5.分支操作5.1.修改要提交的分…

洗地机怎么选择最好?四大洗地机精选放心入手

在当今生活节奏飞快的社会中,人们越来越渴望拥有一款高性能、实用方便的家用洗地机,能够帮助我们节省大量的清洁时间。因为洗地机它是吸尘器的升级版,清洁力比扫地机器人更强,洗地机通过高速旋转的风机,产生超大吸力&a…

java-冒泡排序 2

### 9. 冒泡排序的变种冒泡排序有许多变种,例如鸡尾酒排序(Cocktail Shaker Sort),它是冒泡排序的双向版本。鸡尾酒排序在每次遍历时,先从左到右,再从右到左,双向 地“冒泡”,使得排…

Unity之HTC VIVE Cosmos环境安装(适合新手小白)(一)

提示:能力有限,错误之处,还望指出,不胜感激! 文章目录 前言一、unity版本电脑配置相关关于unity版本下载建议:0.先下载unity Hub1.不要用过于旧的版本2.不要下载最新版本或者其他非长期支持版本 二、官网下…