sql优化小tips

news/2024/11/16 9:50:31/文章来源:https://www.cnblogs.com/fengmian13wl/p/18352366

sql优化小tips


基础sql优化


1、避免使用select * 尽量要什么字段查什么字段,

select * 多查出来的数据在网络上IO传输的过程中,会增加数据传输的是的时间。且 select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。

覆盖索引(Covering Index)
覆盖索引是指一个索引不仅包含了查询中的所有列,而且还包含了查询结果中的所有列。使用覆盖索引可以提高查询性能,因为数据库查询可以直接从索引中获取所需的数据,而不需要回表到主表中去检索额外的数据。这样可以减少磁盘I/O操作,提高查询效率。

例如,如果有一个查询:

   SELECT column1, column2 FROM table WHERE column3 = value;

如果存在一个索引同时包含了 column1column2column3,那么这个索引就是一个覆盖索引。

回表(Back to Table)
回表是指在使用索引查找数据时,如果索引中没有包含查询所需的所有列,数据库就需要回到主表中去检索那些未包含在索引中的列。这个过程称为回表。回表可能会降低查询性能,因为它需要额外的磁盘I/O操作。

继续上面的例子,如果索引只包含了 column3,而没有包含 column1column2,那么在找到符合条件的行后,数据库还需要回到主表中去检索 column1column2 的值,这个过程就是回表。


2、用union all代替union

UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行

我们都知道sql语句使用union关键字后,可以获取排重后的数据。而如果使用union all关键字,可以获取所有数据,包含重复的数据。排重的过程需要遍历、排序和比较,它更耗时,更消耗cpu资源。所以如果能用union all的时候,尽量不用union。

演示数据库
在本教程中,我们将使用 RUNOOB 样本数据库。
下面是选自 "Websites" 表的数据:

mysql> SELECT * FROM Websites;
+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | 菜鸟教程      | http://www.runoob.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+
下面是 "apps" APP 的数据:
mysql> SELECT * FROM apps;
+----+------------+-------------------------+---------+
| id | app_name   | url                     | country |
+----+------------+-------------------------+---------+
|  1 | QQ APP     | http://im.qq.com/       | CN      |
|  2 | 微博 APP | http://weibo.com/       | CN      |
|  3 | 淘宝 APP | https://www.taobao.com/ | CN      |
+----+------------+-------------------------+---------+
3 rows in set (0.00 sec)

SQL UNION 实例
下面的 SQL 语句从 "Websites" 和 "apps" 表中选取所有不同的country(只有不同的值):

实例

SELECT country FROM Websites UNION SELECT country FROM appsORDER BY country;

执行以上 SQL 输出结果如下:

img

注释:UNION 不能用于列出两个表中所有的country。如果一些网站和APP来自同一个国家,每个国家只会列出一次。UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值!

SQL UNION ALL 实例
下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的country(也有重复的值):

实例

SELECT country FROM Websites UNION ALL SELECT country FROM apps
ORDER BY country;

执行以上 SQL 输出结果如下:

img

带有 WHERE 的 SQL UNION ALL
下面的 SQL 语句使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):

实例

SELECT country, name FROM Websites WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps WHERE country='CN'ORDER BY 
country;

执行以上 SQL 输出结果如下:

img


3、小表驱动大表

减少数据集、减少回表操作、减少内存和CPU使用


4、批量操作

减少请求数据次数,利用批量操作来减轻CPU压力,sql性能会得到提升,数据量越多,提升越大。为防止数据库响应过慢,需要注意的是把握好每批数据的量,控制在500以内。

insert into order(id,code,user_id) 
values(123,'001',100),(124,'002',100),(125,'003',101);

5、多用limit

减少数据查找


6、SQL查找是否"存在",别再count了!


7、高效的分页

记录上次的查询的maxID,用条件ID>max limit ??,来分页


8、连接查询代替子查询

mysql中如果需要从两张以上的表中查询出数据的话,一般有两种实现方式:子查询连接查询

子查询的例子如下:

select * from order
where user_id in (select id from user where status=1)

子查询语句可以通过in关键字实现,一个查询语句的条件落在另一个select语句的查询结果中。程序先运行在嵌套在最内层的语句,再运行外层的语句。

子查询语句的优点是简单,结构化,如果涉及的表数量不多的话。

但缺点是mysql执行子查询时,需要创建临时表,查询完毕后,需要再删除这些临时表,有一些额外的性能消耗。

这时可以改成连接查询。具体例子如下:

select o.* from order o
inner join user u on o.user_id = u.id
where u.status=1

9、选择合理的字段类型

减少空间浪费


10、索引优化

Sql优化总结!详细!(2021最新面试必问)-CSDN博客

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

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

相关文章

一些面试小tips

反射 它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。 反射可以让代码更加灵活、(为各种框架提供开箱即用的功能提供了便利),一般我们写业务代码接触到直接使用反射机制的场景不多,但是在…

暑假集训CSP提高模拟17

暑假集训CSP提高模拟17 组题人: @joke3579\(T1\) P222. 符号化方法初探 \(70pts\)原题: [ABC081D] Non-decreasing部分分测试点 \(1\) :输出样例 \(1\) 。 测试点 \(11 \sim 15\) :由于 \(\{ a \}\) 非负,所以对 \(\{ a \}\) 作前缀和即可。 随机 \(pts\) :乱搞。正解当 …

一款.NET开发的AI无损放大工具

前言 今天大姚给大家分享一款由.NET开源(GPL-3.0 license)、基于腾讯ARC Lab提供的Real-ESRGAN模型开发的AI无损放大工具:AI-Lossless-Zoomer。Real-ESRGAN模型专注于人像和动漫图片的高质量无损放大。项目功能 支持多线程处理、批量图片处理、设置选项、自定义输出格式和自…

Java知识点1

Java知识点 什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码…

Python-快速语法参考-全-

Python 快速语法参考(全)原文:The Python Quick Syntax Reference 协议:CC BY-NC-SA 4.0零、简介 Python 提供的最好的东西之一是一个广泛的标准库,它提供了广泛的包含特性,从网络功能、数据库处理和 XML 处理一直到 zip 文件处理。有数百个额外的库扩展了 Python 的能力…

最小斯坦纳树(动态规划求解+原创讲解细节)

最小斯坦纳树给定点的“最小生成树”问题。背景 给定无向连通图 \(G=(V,E)\),给出包含 \(k\) 个结点的点集 \(S\),包含点集 \(S\) 的连通图被称作 斯坦纳树。但我们关注的是如何求出包含点集 \(S\) 的最小连通图 \(G=(V,E)\) 即 最小斯坦纳树。其中\(S\subseteq V,E\subseteq…

Convert类型转换

static void Main(string[] args){//Convert转换:不同数据类型之间的转换;//大前提: 面儿上一定要过得去Console.WriteLine("请输入你的姓名:");string strName = Console.ReadLine();Console.WriteLine("请输入你的数学成绩:");double douMath = Convert.…

python程序代码这样加密保护,你觉得可以吗?

python程序代码很容易反编译,下面我体验了pyhton代码保护的好方法,方案支持windows与Linux系统,下面以linux系统为例进行加密演示。 下载最新Linux平台开发工具包http://chinadlp.com/?list-DriveDownload.html 拷贝到有桌面的Ubuntu系统中 解压:tar -xzf Sentinel-LDK.ta…

win+jenkins+git+allure+tomcat+jdk部署(万人坑)

万人坑:之所以叫万人坑,是一些网站真的是非常非常非常坑,且不说按照他们的方法一次都没成功,还遇到了各种千奇百怪的问题,浪费了本人3.1415926h的时间,真想给他们竖起一个超大号的倒拇指。下面开始踩坑之路! 一.本地环境 jdk:1.8 tomcat:8.5.59 jenkins:2.264 git:2…

stm32寄存器工程创建

一、 寄存器需要库的文件如下,可以从库函数开发里直接拷贝。STM32F40_41xxx记得要把库路径添加进去,否则会报错

005.Vue3入门,使用绑定属性时,绑定多个自定义属性

1、代码如下:<template><div v-bind:id="myId1" v-bind:class="testCls" v-bind="objAttrs">测试1</div> </template><script> export default {data() {return {testCls: "appclass",myId1: "ap…

004.Vue3入门,使用绑定属性时undefined和disabled用法

1、代码如下:<template><div v-bind:id="myId1" v-bind:class="testCls">测试1</div><div v-bind:id="myId2" v-bind:title="testTitle">测试2</div><div :id="myId3" :class="test…