SQL 性能优化总结

在这里插入图片描述

文章目录

  • 一、性能优化策略
  • 二、索引创建规则
  • 三、查询优化总结

一、性能优化策略

1. SQL 语句中 IN 包含的值不应过多
MySQL 将 IN中的常量全部存储在一个排好序的数组里面,但是如果数值较多,产生的消耗也是比较大的。所以对于连续的数值,能用 between 就不要用 in。

2. SELECT 语句务必指明字段名称
SELECT * 增加很多不必要的消耗,所以要求直接在 select 后面接上字段名。

3. 当只需要一条数据的时候,使用 limit 1
这是为了使 EXPLAIN 中 type 列达到 const 类型。

4. 如果排序字段没有用到索引,就尽量少排序

5. 如果限制条件中其他字段没有索引,尽量少用 or
or 两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。

6. 尽量用 union all 代替 union
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算。当然,union all 使用的前提条件是两个结果集没有重复数据。

7. 根据不同情况使用 in 和 exists

如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以IN适合于外表大而内表小的情况,EXISTS适合于外表小而内表大的情况。

select * from 表A where id in (select id from 表B)//用exist改进
select * from 表A where exists(select * from 表B where 表B.id=表A.id)

8. 使用合理的分页方式以提高分页的效率

//随着表数据量的增加,直接使用limit分页查询会越来越慢
select id,name from table_name limit 866613, 20//优化后的代码如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612
select id,name from table_name where id> 866612 limit 20

9. 分段查询
在一些用户选择页面中,可能一些用户选择的时间范围过大,造成查询缓慢,主要的原因是扫描行数过多。这个时候可以通过程序,分段进行查询,循环遍历,将结果合并处理进行展示。

10. 避免在 where 子句中对字段进行 null 值判断

对于null的判断会导致引擎放弃使用索引而进行全表扫描。

11. 不建议使用%前缀模糊查询
例如 LIKE “%name” 或者 LIKE “%name%”,这种查询会导致索引失效而进行全表扫描,若要提高效率,可以考虑全文检索。

12. 避免在where子句中对字段进行表达式操作

//这会造成引擎放弃使用索引
select user_id,user_project from table_name where age*2=36;//可以将上面查询语句改成这样,提高性能
select user_id,user_project from table_name where age=36/2;

13. 避免隐式类型转换

where 子句中出现 column 字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

14. 对于联合索引来说,要遵守最左前缀法则

在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。

15. 对于联合查询要注意范围查询语句

如果存在范围查询,比如between,>,<等条件时,会造成后面的索引字段失效。

16. 尽量使用 inner join,避免left join

参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表, 但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表。
在这里插入图片描述
17. 尽量避免全表扫描
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

18. 尽量使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

19. 尽可能的使用 varchar 代替 char
首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

20. 尽量避免向客户端返回大数据量
若数据量过大,应该考虑相应需求是否合理。

21. 使用表的别名
当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个 Colum上。这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误,表名、列名在查询中以一个字母为别名,查询速
度要比建连接表快1.5倍。

22. 使用“临时表”暂存中间结果
将临时结果暂存在临时表,后面的查询就在 tempdb 中了,这可以避免程序中多次扫描主表,也大大减少了阻塞,提高了并发性能。

23. 事先计算好结果
将需要查询的结果预先计算好放在表中,查询的时候再Select。

24. 不要有超过5个以上的表连接,少用子查询

25. IN 优化
在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

26. 尽量将数据的处理工作放在服务器上,减少网络的开销

27. 合理调配线程数量
当服务器的内存够多时,配制线程数量 = 最大连接数 + 5,这样能发挥最大的效率;否则使用配制线程数量 < 最大连接数,并启用 SQL SERVER 的线程池来解决,如果还是数量 = 最大连接数 + 5,这会严重地损害服务器的性能。

28. 要注意索引的维护,周期性重建索引,重新编译存储过程

29. 批量插入或批量更新
当有一批处理的插入或更新时,用批量插入或批量更新,绝不会一条条记录的去更新。

30. 尽量少使用循环
在所有的存储过程中,能够用SQL语句的,绝不会用循环去实现。

31. 选择最有效率的表名顺序
Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名,FROM 子句中写在最后的表(基础表)将被最先处理,在 FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。

32. 提高GROUP BY语句的效率
可以通过将不需要的记录在GROUP BY之前过滤掉。

//低效
SELECT JOB , AVG(SAL) 
FROM EMP 
GROUP BY JOB 
HAVING JOB =’PRESIDENT’ 
OR JOB =’MANAGER’//高效
SELECT JOB , AVG(SAL) 
FROM EMP 
WHERE JOB =’PRESIDENT’ 
OR JOB =’MANAGER’ 
GROUP BY JOB

33. SQL语句用大写
因为Oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

34. 避免死锁
在一个事务中应尽可能减少涉及到的数据量,永远不要在事务中等待用户输入。

35. 最好不要使用触发器
触发一个触发器,执行一个触发器事件本身就是一个耗费资源的过程,如果能够使用约束实现的,就尽量不要使用触发器。

36. 应尽量减少空格的使用
在写 SQL 语句时,应尽量减少空格的使用,尤其是在 SQL 首和尾的空格,因为查询缓冲并不自动截取首尾空格。

37. 为数据库里的每张表都设置一个ID做为主键
而且最好是 INT类型的,并设置上自动增加的 AUTO_INCREMENT 标志。

38. MySQL 查询可以启用高速查询缓存
这是提高数据库性能的有效方法之一。当同一个查询被执行多次时,从缓存中提取数据比直接从数据库中返回数据要快的多。

39. EXPLAIN SELECT 查询用来跟踪查看效果
使用 EXPLAIN 关键字可以让你知道 MySQL 是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。

40. 当只要一行数据时使用 LIMIT 1
当你查询表的有些时候,你已经知道结果只会有一条结果,在这种情况下,加上 LIMIT 1 可以增加性能。这样一来,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。

41. 优化表的数据类型
原则就是简单实用,因此在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 所有字段都得有默认值,尽量避免null。

42. 尽可能将操作移至等号右边
任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移
至等号右边。

二、索引创建规则

表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。
另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数
据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

(1)表的主键、外键必须有索引;
(2)数据量超过300的表应该有索引;
(3)经常与其他表进行连接的表,在连接字段上应该建立索引;
(4)经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
(5)索引应该建在选择性高的字段上;
(6)索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
(7)复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替;
(8)正确选择复合索引中的主列字段,一般是选择性较好的字段;
(9)如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
(10)如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
(11)如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
(12)频繁进行数据操作的表,不要建立太多的索引;
(13)删除无用的索引,避免对执行计划造成负面影响;
(14)尽量不要对数据库中某个含有大量重复的值的字段建立索引。

三、查询优化总结

(1)使用慢查询日志去发现慢查询,使用执行计划去判断查询是否正常运行,总是去测试你的查询看看是否他们运行在最佳状态下;
(2)避免在整个表上使用 count(*),它可能锁住整张表;
(3)使查询保持一致,以便后续相似的查询可以使用查询缓存;
(4)在 WHERE、GROUP BY 和 ORDER BY 子句中使用有索引的列,保持索引简单,不在多个索引中包含同一个列;
(5)对于记录数小于5的索引字段,在UNION的时候使用LIMIT不是是用OR;
(6)为了避免在更新前 SELECT,使用 INSERT ON DUPLICATE KEY 或者 INSERT IGNORE;
(7)在WHERE子句中使用 UNION 代替子查询,考虑持久连接,而不是多个连接,以减少开销;
(8)当负载增加在服务器上,使用 SHOW PROCESSLIST 查看慢查询和有问题的查询,在镜像数据中测试所有可疑的查询。

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

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

相关文章

如何用在线模版快速制作活动海报?

在时代的发展和信息传播的快速发展下&#xff0c;活动海报成为了宣传活动的重要方式之一。设计一张吸引眼球的活动海报&#xff0c;不仅能够有效传递信息&#xff0c;还能够吸引人们的注意力。那么&#xff0c;在这里我将教会大家如何设计活动海报&#xff0c;只需要三分钟&…

12.(Python数模)(相关性分析一)相关系数矩阵

相关系数矩阵 相关系数矩阵是用于衡量多个变量之间关系强度和方向的统计工具。它是一个对称矩阵&#xff0c;其中每个元素表示对应变量之间的相关系数。 要计算相关系数矩阵&#xff0c;首先需要计算每对变量之间的相关系数。常用的相关系数包括皮尔逊相关系数和斯皮尔曼相关…

【JAVA-Day14】深入了解 Java 中的 while 循环语句

深入了解 Java 中的 while 循环语句 深入了解 Java 中的 while 循环语句摘要引言一、什么是 while 循环语句二、while 循环语句的语法和使用场景使用场景 三、while 循环的优势和使用场景优势使用建议 四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的…

Mysql详解Explain索引优化最佳实践

目录 1 Explain工具介绍2 explain 两个变种3 explain中的列3.1 id列3.2 select_type列3.3 table列3.4. type列3.5 possible_keys列3.6 key列3.7 key_len列3.8 ref列3.9 rows列3.10 Extra列 4 索引最佳实践4.1.全值匹配4.2.最左前缀法则4.3.不在索引列上做任何操作&#xff08;计…

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格

stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格&#xff1f; 在添加参数到 StringBuffer 时&#xff0c;你可以在每次添加参数之后都添加一个空格&#xff0c;如下所示&#xff1a; StringBuffer stringBu…

零信任:基于Apisix构建认证网关

最终效果 基于身份认证的零信任网关 - 知乎 背景 零信任一直是我们未来主攻的一个方向&#xff0c;全球加速&#xff0c;SD-WAN组网都是一些非常成熟的产品&#xff0c;全球加速是我们所有产品的底座&#xff0c;SD-WAN解决的是多个网络打通的问题&#xff0c;而零信任则主打…

『PyQt5-Qt Designer篇』| 09 Qt Designer中分割线和间隔如何使用?

09 Qt Designer中分割线和间隔如何使用? 1 间隔1.1 水平间隔1.2 垂直间隔2 分割线2.1 水平线2.2 垂直线3 保存并执行1 间隔 间隔有水平间隔和垂直间隔: 1.1 水平间隔 拖动4个按钮,并设置为水平布局: 在第一个按钮的右边添加一个水平间隔: 设置其sizeType为Fixed,宽度为20…

c++ 函数的参数是否可以为auto

&#xff08;1&#xff09;在vs2019开到 cpp20 的语法规范&#xff0c;是可以的 &#xff08;2&#xff09;但网上和文心一言和书上说不可以 (2) 再附上一种auto 的很炫酷的写法&#xff1a;

HTML+CSS画一个卡通中秋月饼

HTMLCSS画一个卡通中秋月饼&#x1f96e;&#x1f96e;&#x1f96e; 中秋活动水个文章 整个divcss实现个月饼&#xff0c;给前端初学者一个练手的demo 效果图 思路 HTMl 先来个轮廓画脸上的东西&#xff1a;眼睛、眉毛、腮红、嘴巴眼睛丰富下瞳孔画20个花瓣 CSS 轮廓是要外…

【MySQL】 MySQL数据库基础

文章目录 &#x1f431;‍&#x1f453;数据库的操作&#x1f4cc;显示当前的数据库&#x1f4cc;创建数据库&#x1f388;语法&#xff1a;&#x1f388;语法说明&#x1f388;示例&#xff1a; &#x1f334;使用数据库&#x1f38b;删除数据库&#x1f431;‍&#x1f3cd;语…

react的状态管理简单钩子方法

1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中&#xff0c;方便进行状态管理 export interface StateProps {id: number;text: string;isFini…

HTML导航栏二级菜单(垂直、水平方向)

二级菜单是指主菜单的子菜单。菜单栏实际是一种树型结构&#xff0c;子菜单是菜单栏的一个分支。简单分享主要的垂直和水平方向的CSS设计。 垂直方向&#xff1a; HTML: <body><div><ul><li><a href"#">家用电器</a><ul>…

灰狼算法Grey Wolf Optimizer跑23个经典测试函数|含源码

智能优化算法&#xff08;Grey Wolf Optimizer&#xff09; 文章目录 智能优化算法&#xff08;Grey Wolf Optimizer&#xff09;前言一、灵感二、GWO数学模型1、包围猎物2、狩猎3、攻击猎物4、开发5、代码实现 总结 前言 灰狼算法简介&#xff1a; 灰狼优化算法&#xff08;G…

使用电力系统稳定器 (PSS) 和静态 VAR 补偿器 (SVC) 提高瞬态稳定性(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MATLAB遗传算法求解生鲜货损制冷时间窗碳排放多成本车辆路径规划问题

MATLAB遗传算法求解生鲜货损制冷时间窗碳排放多成本车辆路径规划问题实例 1、问题描述 已知配送中心和需求门店的地理位置,并且已经获得各个门店的需求量。关于送货时间的要求,门店都有规定的时间窗,对于超过规定时间窗外的配送时间会产生相应的惩罚成本。为保持生鲜农产品的…

Git: 工作区、暂存区、本地仓库、远程仓库

参考链接&#xff1a; Git: 工作区、暂存区、本地仓库、远程仓库 https://blog.csdn.net/weixin_36750623/article/details/96189838

通过stream流实现分页、模糊搜索、按列过滤功能

通过stream实现分页、模糊搜索、按列过滤功能 背景逻辑展示示例代码 背景 在有一些数据通过数据库查询出来后&#xff0c;需要经过一定的逻辑处理才进行前端展示&#xff0c;这时候需要在程序中进行相应的分页、模糊搜索、按列过滤了。这些功能通过普通的逻辑处理可能较为繁琐…

Hadoop-Hbase

1. Hbase安装 1.1 安装zookeeper、 hbase 解压至/opt/soft&#xff0c;并分别改名 配置环境变量并source生效 #ZK export ZOOKEEPER_HOME/opt/soft/zk345 export PATH$ZOOKEEPER_HOME/bin:$PATH #HBASE_HOME export HBASE_HOME/opt/soft/hbase235 export PATH$HBASE_HOME/b…

windows平台 git bash使用

打开所在需要git管理的目录,鼠标右键open Git BASH here 这样就直接进来,不需要windows dos窗口下麻烦的切路径&#xff0c;windows和linux 路径方向不一致 (\ /) 然后git init 建立本地仓库,接下来就是git相关的操作了. 图形化界面查看 打开所在需要git管理的目录,鼠标右键…

SpringMVC系列(四)之SpringMVC实现文件上传和下载

目录 前言 一. SpringMVC文件上传 1. 配置多功能视图解析器 2. 前端代码中&#xff0c;将表单标记为多功能表单 3. 后端利用MultipartFile 接口&#xff0c;接收前端传递到后台的文件 4. 文件上传示例 1. 相关依赖&#xff1a; 2. 逆向生成对应的类 3. 后端代码&#xf…