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 查看慢查询和有问题的查询,在镜像数据中测试所有可疑的查询。
相关文章:
SQL 性能优化总结
文章目录 一、性能优化策略二、索引创建规则三、查询优化总结 一、性能优化策略 1. SQL 语句中 IN 包含的值不应过多 MySQL 将 IN中的常量全部存储在一个排好序的数组里面,但是如果数值较多,产生的消耗也是比较大的。所以对于连续的数值,能用…...
MYSQL事务隔离级别分析
MYSQL事务隔离级别分析 不可重复读和幻读的区别? 不可重复读和幻读的区别? 先理解几个概念 不可重复读 一个事务中,后续查询结果得到不同的数据,可被重复读隔离级别解决幻影 出现在查询结果集中但不出现在较早查询的结果集中的行幻…...
学习javaEE初阶的第一堂课
学习金字塔 java发展简史 Java最初诞生的时候是用来写前端的!! 199x年 199x年,互联网还处在比较早期的阶段,当时主流的编程语言是 C/C, 有个大佬要搞个"智能面包机",觉得用C来做太难了 于是就基于C搞了个简单点的语言,Java 就诞生了~~ 遗憾的是项目流产了,没做成…...
请问一下就是业务概念模型和业务逻辑模型有啥关系
请问一下就是业务概念模型和业务逻辑模型有啥关系? 业务概念模型和业务逻辑模型是业务建模的两个关键组成部分,两者密切相关但又有所不同。 1.业务概念模型:这是对业务术语、定义和关系的一种抽象表示。它是从业务专家那里获得的知识&#…...
3.2 Android eBPF程序类型
写在前面 为什么要先了解eBPF程序类型? 从帮助函数中,我们可能基于内核的eBPF开放API,对eBPF的能力有一个比较细致的认识,但是这并不能让我们从全局,或者更概括的认识eBPF。eBPF程序类型能够更宏观的告诉我们,eBPF能做哪些事情(除网络相关)。 一,eBPF程序类型 内核…...
多目标优化算法:基于非支配排序的小龙虾优化算法(NSCOA)MATLAB
一、小龙虾优化算法COA 小龙虾优化算法(Crayfsh optimization algorithm,COA)由Jia Heming 等人于2023年提出,该算法模拟小龙虾的避暑、竞争和觅食行为,具有搜索速度快,搜索能力强,能够有效平衡…...
Linux学习第13天:嵌入式LinuxLED驱动开发:一字一符总见情
在正式写这篇笔记前,有一个事情必须要说一下。昨天更新的基于API函数的字符设备驱动开发按照正常的教程来说应该在本笔记后一天更新才对。但是由于我一时的疏忽,跳过了本笔记。在昨天学习基于API函数的时候造成了一定程度的困扰。今天重翻教程的时候才发…...
ModuleNotFoundError: No module named ‘omni‘
install isaac sim on linux open the isaac sim folder in /home//.local/share/ov/pkg/isaac_sim-2022.1.1 source setup_python_env.sh ./python.sh standalone_examples/replicator/offline_generation.pyNo module named ‘omni.isaac’...
题解:ABC320B - Longest Palindrome
题解:ABC320B - Longest Palindrome 题目 链接:Atcoder。 链接:洛谷。 难度 算法难度:C。 思维难度:C。 调码难度:C。 综合评价:入门。 算法 字符串处理。 思路 通过双层循环分别枚…...
大模型从入门到应用——LangChain:代理(Agents)-[代理执行器(Agent Executor):结合使用Agent和VectorStore]
分类目录:《大模型从入门到应用》总目录 代理执行器接受一个代理和工具,并使用代理来决定调用哪些工具以及以何种顺序调用。本文将参数如何结合使用Agent和VectorStore。这种用法是将数据加载到VectorStore中,并希望以Agent的方式与之进行交互…...
【算法题】100040. 让所有学生保持开心的分组方法数
题目: 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,其中 n 是班级中学生的总数。班主任希望能够在让所有学生保持开心的情况下选出一组学生: 如果能够满足下述两个条件之一,则认为第 i 位学生将会保持开心: …...
TrOCR – 基于 Transformer 的 OCR 入门
一、TrOCR 架构 近些年,光学字符识别 (OCR) 出现了多项创新。它对零售、医疗保健、银行和许多其他行业的影响是巨大的。与深度学习的许多其他领域一样,OCR领域也看到了Transformer 神经网络的重要性和影响。如今,出现了像TrOCR(Transformer OCR)这样的模型,它在准确性方面…...
单例模式优缺点
单例模式是一种创建型设计模式,其主要目的是确保类只有一个实例,并提供全局访问点来获取该实例。单例模式具有一些优点和缺点,下面我将列出它们: **优点:** 1. **全局唯一性**:单例模式确保在应用程序中只…...
【Java 基础篇】Java 字节流详解:从入门到精通
Java中的字节流是处理二进制数据的关键工具之一。无论是文件操作、网络通信还是数据处理,字节流都发挥着重要作用。本文将从基础概念开始,深入探讨Java字节流的使用,旨在帮助初学者理解和掌握这一重要主题。 什么是字节流? 在Ja…...
Vue记录(下篇)
Vuex getters配置项 *Count.vue <template><div><h1>当前求和为:{{$store.state.sum}}</h1><h3>当前求和的10倍为:{{$store.getters.bigSum}}</h3><select v-model.number"n"><option value&q…...
【测试开发】概念篇 · 测试相关基础概念 · 常见开发模型 · 常见测试模型
【测试开发】概念篇 文章目录 【测试开发】概念篇1. 什么是需求1.1 需求的定义1.2 为什么有需求1.3 测试人员眼里的需求1.4 如何深入了解需求 2. 什么是测试用例2.1 为什么有测试用例2.2 练习>手机打电话 3. 什么是bug4. 开发模型和测试模型4.1 软件生命周期4.2 开发模型4.3…...
1. 快速体验 VSCode 和 CMake 创建 C/C++项目
1. 快速体验 VSCode 和 CMake 创建 C/C项目 本章的全部代码和markdown文件地址: CMake_Tutorial,欢迎互相交流. 此次介绍的内容都是针对于 Linux 操作系统上的开发过程. 1.1 安装开发工具 VSCode: 自行下载安装, 然后安装插件 Cmake:在 Ubuntu 系统上, 可以采用 ap…...
【JAVA-Day18】用大白话讲解 Java 中的内存机制
标题 用大白话讲解 Java 中的内存机制摘要引言一、Java 内存机制1.1 栈内存1.2 堆内存 二、Java 如何管理内存三、合理管理内存的必要性与其他方式相比优势劣势建议四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《…...
[Hadoop] start-dfs.sh ssh报错
Permission denied (publickey 决解方案 相关命令 cd ~/.sshssh-keygen -t rsa -p""cat id_rsa.pub >> authorized_keyschmod 0600 authorized_keys 相关链接Hadoop: start-dfs.sh permission denied - Stack Overflow Java HotSpot(TM) Server VM warning…...
amlogic 多wifi 多bluetooh 兼容方案
WiFi部分: vendor/amlogic/common/wifi_bt/wifi/configs/wifi.mk 或者 hardware/amlogic/wifi/configs/wifi.mk ################################################################################## realtek wifi ifneq ($(filter rtl8188eu rtl8188ftv rtl8192eu rtl8…...
Apache Hive概述,模拟实现Hive功能,Hive基础架构
1、Apache Hive 概述 1.1、分布式SQL计算 对数据进行统计分析,SQL是目前最为方便的编程工具。 大数据体系中充斥着非常多的统计分析场景 所以,使用SQL去处理数据,在大数据中也是有极大的需求的。 MapReduce支持程序开发(Java…...
postgresql|数据库|centos7下基于postgresql-12的主从复制的pgpool-4.4的部署和使用
前言: postgresql数据库只用自身的一些配置是无法做到最优的优化的,需要通过一些外置插件(中间件)来提高服务器的整体性能,通俗的说就是数据库仅仅依靠自身是无法达到性能最优的,很多时候需要更改数据库的…...
python之pyQt5实例:PyQtGraph的应用
1、显示逻辑 "MainWindow": "这是主窗口,所有的其他组件都会被添加到这个窗口上。", "centralwidget": "这是主窗口的中心部件,它包含了其他的部件。","pushButton": "这是一个按钮,…...
Java——键盘输入的几种常见方式
Java——键盘输入的几种常见方式 文章目录: Java——键盘输入的几种常见方式一、IO流二、Scanner类三 、BufferedReader写入 一、IO流 在Java的输入中,是以输入流的形式进入程序,因此无法直接指定输入的类型,仅能读取键盘上的内容…...
Shell脚本中文英文多语言国际化和命令行批处理(bash sh cmd bat)中定义函数的简单写法
文章目录 命令行脚本参考 - bat命令行脚本参考 - bash值得学习的知识点1. 识别终端使用的语言2. 函数的编写3. 获取用户的输入4. bat文件老是乱码怎么办 有时候为了方便别人使用,我们会选择去编写各种各样的命令行脚本:给Windows用户编写.bat cmd批处理脚…...
stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格
stringBuffer.append(analyze);使用这个拼接时候如何在字符串参数字符串参数整数参数字符串数组参数内容之间添加空格? 在添加参数到 StringBuffer 时,你可以在每次添加参数之后都添加一个空格,如下所示: StringBuffer stringBu…...
点云从入门到精通技术详解100篇-大范围田间场景 3D 点云语义分割研究(续)
目录 3.2 自制数据集展示 3.2.1 收集航拍图像 3.2.2 3D 点云重建 3.2.3 语义标签标注...
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.不在索引列上做任何操作(计…...
STM32H7 Azure RTOS
STM32H7 是意法半导体(STMicroelectronics)推出的一款高性能微控制器系列,基于 Arm Cortex-M7 内核。它具有丰富的外设和高性能计算能力,适用于各种应用领域。 Azure RTOS(原名 ThreadX)是一款实时操作系统…...
基于LUT查找表方法的图像gamma校正算法FPGA实现,包括tb测试文件和MATLAB辅助验证
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将gamma2.2和gamma1/2.2的数据分别导入到matlab进行对比: 2.算法运行软件版本 matlab2022a 3.部分核心程序 timescale 1ns / 1ps //…...
无法访问服务器上网站/互联网广告公司
本文主要讲诉在使用VS2012SQL Server数据库做系统中,通常会遇到几个问题.使用dataGridView控件在修改、删除、插入数据后,怎样刷新数据显示操作后的结果.同时在对数据操作时通常会判断数据的主键是否存在或重复,判断外键是否重复,这几个问题我推荐使用函数的形式完成,同时推荐一…...
搭建网站挣钱/网易疫情实时最新数据
负责控制信号的输入和输出叫做使能,是一个动词,英文‘Enable’。英文Enable,前缀en-就是使的意思,able就是能够。合起来就是使能。使能通俗点说就是一个“允许”信号,进给使能也就是允许进给的信号,也就是说…...
电子商务的网站案例/网络营销电子版教材
题目大意是: 有一些点,每个点都有一个重量值,然后给出了一些边,每个边都有一个权值 最后让用一些边组成一棵树,使得花费最少,每个边(u,v)的花费(边得所有子孙节点的重量和)*(该边的权值) 对于这个花费&a…...
新西兰做网站代购/湖南中高风险地区
题目描述 兄弟俩骑车郊游,弟弟先出发,每分钟X米,M分钟后,哥哥带一条狗出发。以每分钟Y米的速度去追弟弟,而狗则以每分钟Z米的速度向弟弟跑去,追上弟弟后又立即返回,直到哥哥追上弟弟时ÿ…...
红岗网站建设/西安网页设计
php简介,php历史,php后端工程师职业前景,php技术方向,php后端工程师职业体系介绍。 php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言ÿ…...
python 做网站缺点/网站优化推广seo
前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载, 有兴趣的童鞋可…...