数据库调优-SQL语句优化
2. SQL语句优化
sql
复制代码
# 请问这两条SQL语句有什么区别呢?你来猜一猜那条SQL语句执行查询效果更好! select id from sys_goods where goods_name='华为 HUAWEI 麦芒7 魅海蓝 6G+64G 全网通'; select id from sys_goods where goods_id=1496732598527979521;
2.1. 查看SQL执行计划【explain】
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句的执行计划进行分析, 并输出 SELECT 执行的 详细信息, 以供开发人员针对性优化。使用explain这个命令来查看一个这些SQL语句的执行计划,查看 该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。
可以通过explain命令深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访 问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。
EXPLAIN 命令用法十分简单, 在 SELECT 语句前加上 explain 就可以了, 例如:
在MySQL中可以使用explain 查看SQL执行计划,用法:
sql
复制代码
EXPLAIN SELECT * FROM t_user;

- id:SELECT识别符,这是SELECT查询序列号。
- select_type(重要):表示单位查询的查询类型,比如:普通查询、联合查询(union、union all)、子查询等复杂查询。
- table:表示查询的表。
- partitions:使用的哪些分区(对于非分区表值为null)。
- type(重要)表示表的连接类型。
- possible_keys:此次查询中可能选用的索引,一个或多个
- key:查询真正使用到的索引
- key_len:显示MySQL决定使用的索引长度。
- ref:哪个字段或常数与 key 一起被使用
- rows:显示此查询一共扫描了多少行,这个是一个估计值。不精确值
- filtered: 表示此查询条件所过滤的数据的百分比
- Extra(重要):额外信息
哈哈,看到这么多的参数,可能,大部分人都直接放弃了!!!
xdm,别怕,重点的参数,我已经标出来了,也就3个,那我们就针对这3个参数进行详细说明吧。
select_type:查询类型
type:连接类型
Extra:额外信息
哈哈,开干!!!

2.2. 关键结果说明
2.2.1 select_type
单位查询的查询类型,比如:普通查询、联合查询(union、union all)、子查询等复杂查询。
有以下几种值:
-
simple: 普通查询,表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple。
-
primary: 查询的主要部分, 一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。
-
union:连接查询 ,union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
- derived在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
- union若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
- union result 从UNION表获取结果的SELECT
- dependent union: 依赖连接查询 ,与union一样,出现在union 或union all语句中,但是这个 查询要受到外部查询的影响
- subquery: 子查询 ,除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery
- dependent subquery: 依赖子查询, 与dependent union类似,表示这个subquery的查询要受到外部表查询的影响
- derived:派生表, from字句中出现的子查询,也叫做派生表,其他数据库中可能叫做内联视图或嵌套select
01-simple简单查询
csharp
复制代码
-- simple: 表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple。 explain select * from t_user;

02-union连接查询
sql
复制代码
-- union: union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union -- 语句 1 explain select * from t_user a union select * from t_user b; -- UNION 若第二个SELECT出现在UNION之后,则被标记为UNION: -- 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED -- UNION RESULT 从UNION表获取结果的SELECT -- 语句 2 explain select * from ( select * from t_user a union select * from t_user b) c; -- DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中


sql
复制代码
-- dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 explain select * from t_user a where a.id in (select id from t_user b union select id from t_user c);

03-subquery子查询
csharp
复制代码
-- subquery 除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery explain select (select id from t_user where id=1) from t_user;

css
复制代码
-- dependent subquery 与dependent union类似,表示这个subquery的查询要受到外部表查询的影响 explain select (select id from t_user a where a.id=b.id) from t_user b;

2.2.2 type
显示的是单位查询的 查询类型 或者理解为 访问类型 ,访问性能依次从好到差:
sql
复制代码
system const eq_ref ref fulltext ref_or_null unique_subquery index_subquery range index_merge index ALL:查询效率很低,而且耗CPU,在数据量大的情况下才会出现
-
system :表中 只有一行数据或者是空表 。等于系统表,这是const类型的特列,平时不会出现,可以忽略不计
-
const(重要) :使用 唯一索引或者主键 ,返回记录一定是 1 行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描。
-
eq_ref(重要) : 唯一性索 引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
-
ref(重要) : 非唯一性索 引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
- 组合索引
- 非唯一索引
-
fulltext :全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
-
ref_or_null :与ref方法类似,只是增加了null值的比较。实际用的不多。
-
unique_subquery :用于where中的in形式子查询,子查询返回不重复值唯一值
-
index_subquery :用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
-
range(重要) : 索引范围扫描 ,常见于使用>,<,is null,between ,in ,like等运算符的查询中。
-
index_merge :表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range
-
index(重要) :select结果列中使用到了索引,type会显示为index。 全部索引扫描 ,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
-
all(重要) :这个就是全表扫描数据文件,然后再 在server层进行过滤 返回符合要求的记录。
- 除了all之外,其他的type都可以使用到索引
- 除了index_merge之外,其他的type只可以用到一个索引
- 最少要使用到range级别
详解:
01-const:
- 使用 唯一索引或者主键 ,返回记录一定是 1 行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描。
csharp
复制代码
explain select * from t_user where id=1;

02-eq_ref:
- 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
css
复制代码
explain select * from t_user a left join t_user b on a.id=b.id;

03-ref:
- 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
组合索引
csharp
复制代码
-- ref 组合索引 explain select * from t_user where username="llsydn"; explain select * from t_user a left join t_user b on a.username=b.username;


非唯一索引
csharp
复制代码
-- ref 非唯一索引 explain select * from t_user where account='llsydn';

04-range:
- 索引范围扫描 ,常见于使用>,<,is null,between ,in ,like等运算符的查询中。
sql
复制代码
explain select * from t_user where account like 'lls%';

05-index:
- select结果列中使用到了索引,type会显示为index。 全部索引扫描 ,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
csharp
复制代码
explain select account from t_user;

06-all:
- 这个就是全表扫描数据文件,然后再 在server层进行过滤 返回符合要求的记录。
csharp
复制代码
1 explain select * from t_user;

2.2.3 Extra
这个列包含不适合在其他列中显示的,但十分重要的额外的信息,这个列可以显示的信息非常多,有几十种。解释几个经常遇到的
01-Using filesort
- 使用了文件排序,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。这种操作需要优化sql。
sql
复制代码
-- 无索引,按照文件排序 explain select sort_number from t_menu order by sort_number;

sql
复制代码
-- 有索引,不按照文件排序 explain select sort_number from t_menu order by sort_number;

02-using index
表示相应的SELECT查询中使用到了索引,避免访问表的数据行,这种查询的效率很高!
- 如果同时出现Using Where ,索引在where之后,用作查询条件
- 如果没有同时出现Using Where ,索引在where之前,用作查询结果读取
vbnet
复制代码
-- 使用where,索引在where之后,用作查询条件 explain select sort_number from t_menu where id>0 order by sort_number;

vbnet
复制代码
-- 没有使用where,索引在where之前,用作查询结果读取 explain select sort_number from t_menu where id>0 order by sort_number;

03-using where
- 表示Mysql将对storage engine提取的结果进行过滤,过滤条件字段无索引;
csharp
复制代码
-- 只有where explain select * from t_menu where id>0;

04-Using join buffer
- 表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。

2.3. 为什么使用索引就能加快查询速度呢?
二叉树数据结构,与搜索算法时间复杂度:
B+Tree
面试常问题目:有没有做过数据库优化呀?我来问你一个特别简单的问题,查询的是有没有加过索引?
为什么要加索引?加上了索引之后速度就会变快吗?请您简单描述一下原因吧?
- 什么是索引:索引就是事先排好顺序,然后在查询的时候使用二分法等高校的查询算法来进行高效查询。
- 除了索引查询,肯定一般查询:这两者的差异是数量级的差异。
- 二分法或索引查询的时间复杂度O(log2N),使用一般查询时间的复杂度是O(n)
举例来说:100w条数据,一般查询,平均 50 万条,比较 50 万次。如果用二分法,只需要不超过 20 次就可以找到数据!
二分法这种查找方式,效率是一般查询的2.5万倍!
哈哈,这里还是直接mark下吧!!!
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”


相关文章:
数据库调优-SQL语句优化
2. SQL语句优化 sql 复制代码 # 请问这两条SQL语句有什么区别呢?你来猜一猜那条SQL语句执行查询效果更好! select id from sys_goods where goods_name华为 HUAWEI 麦芒7 魅海蓝 6G64G 全网通; select id from sys_goods where goods_id14967325985…...
h函数 render函数 JSX基本用法
1.1认识h函数(hyperscript工具 基于JavaScript编写模板的工具) Vue推荐在绝大多数情况下使用模板来创建你的HTML,然后一些特殊的场景,需要JavaSript的完全编程能力,可以使用渲染函数,它比模板更接近编译器&…...
购物车操作
添加购物车: 需求分析和接口设计: 接口设计: 请求方式:POST 请求路径:/user/shoppingCart/add请求参数:套餐id、菜品id、口味返回结果:code、data、msg 数据库设计: 这上面出现了…...
华为手机 鸿蒙系统-android studio识别调试设备,开启adb调试权限
1.进入设置-关于手机-版本号,连续点击7次 认证:有锁屏密码需要输入密码, 开启开发者配置功能ok 进入开发者配置界面 打开调试功能 重新在androd studio查看可运行running devices显示了, 不行的话,重启一下android …...
计算机网络——Dijkstra路由算法
实验目的 实现基于 Dijkstra 算法的路由软件 实验内容 网络拓扑如图所示 实验过程 先编写开辟应该图的空间,然后给点映射数字,构建图。程序获取用户输入的学号,构建图中边的权值。接下来程序从用户输入获取最短路径的搜索起点࿰…...
AI智能化逐渐趋于成熟后,预测今后最吃香的开发职业
AI智能化正在成熟的路途中,这中间会有波折,但终有一天会来的,我相信等到了这一天,我们的开发效率和代码质量,将会大大不同,而我们的团队与个人,也会面临着很棒的体验。 那么在AI智能化真正趋于成…...
Acwing2024蓝桥杯BFS
AcWing 1355. 母亲的牛奶 bfs: #include<iostream> #include<queue> using namespace std; const int N21; int A,B,C; bool flag[N][N][N]; struct node{int a,b,c; }; queue<node>q; void check(int a,int b,int c){if(!flag[a][b][c]){q.push({a,b,c})…...
vue打包报错:CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
前言: vue项目,打包报错:CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 报错现象: 报错原因: 这个错误是由Node.js在尝试分配内存时因为系统的可用内存不足而发生的。"JavaScript heap…...
计算机组成原理网课笔记
无符号整数的表示与运算 带符号整数的表示与运算 原反补码的特性对比 移码 定点小数...
Python学习第四部分 函数式编程
文章目录 高阶函数lambda 表达式和匿名函数偏函数闭包map函数reduce函数filter 函数sorted函数 函数式编程主要学习:高阶函数、闭包closure、匿名函数、偏函数,map函数、reduce函数、filter函数、sorted函数 函数式编程是个很古老的概念,最古…...
数据结构-二叉树-AVL树(平衡二叉树)
红黑树是平衡二叉树的一个变种。 一、 产生平衡二叉树的原因。 二叉搜索树的问题在于极端场景下退化为类似链表的结构,所以搜索的时间复杂度就变成了O(N)。为了保证二叉树不退化为链表,我们必须保证二叉树的的平衡性。 二叉平衡搜索树就是解决上面的问…...
【Qt问题】windeployqt如何提取Qt依赖库
往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是:当我们的程序运行好之后&#…...
VS2019下使用MFC完成科技项目管理系统
背景: (一)实验目的 通过该实验,使学生掌握windows程序设计的基本方法。了解科技项目组织管理的主要内容和管理方面的基本常识,熟练应用数据库知识,通过处理过程对计算机软件系统工作原理的进一步理解&…...
【Android】Kotlin学习之数据容器(数组for循环遍历)
数组遍历 1. for ( item in arr){…} 2. for ( i in arr.indeces ) {…} (遍历下标) 3. for ((index, item) in arr.withInfex()) {…} (遍历下标和元素) 4. arr.forEach {} ( 遍历元素 ) 5. arr.forEachIndexed{index, item -> …}...
JavaWeb_请求响应_简单参数实体参数
一、SpringBoot方式接收携带简单参数的请求 简单参数:参数名与形参变量名相同,定义形参即可接收参数。并且在接收过程中,会进行自动的类型转换。 启动应用程序后,在postman中进行测试: 请求成功,响应回了O…...
windows端口复用
1. 概述 使用 HTTP.sys 中的 Net.tcp Port Sharing 服务,配合 WinRM 实现端口复用。 优点: HTTP.sys 为 windows 原生机制, WinRM 为 windows 自带功能,动作较小,不易触发主 动防御。 需要管理员权限。 2. 原理 (…...
[Redis] 使用布隆过滤器和分布式锁实现用户注册
布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示一个集合,当一个元素被加入到集合时,通过哈希函数计算出多个哈希值,并…...
Okhttp 发送https请求,忽略ssl认证
工具类 import lombok.extern.slf4j.Slf4j;import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509Tru…...
IT项目管理-大题【太原理工大学】
一、根据进度网络写出时间参数表、关键路径、总工期 此类题一般是给一个表,问三问。 第一问会问某个活动的时间参数,但我们需要把整个表都求出来,否则单求一个很困难(如果你就是不想求整张表也行,不是硬性要求…...
【代码随想录】day48
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、198打家劫舍二、213打家劫舍II三、337打家劫舍III 一、198打家劫舍 class Solution { public:int rob(vector<int>& nums) {vector<int> dp(n…...
NPC逆变器模糊超螺旋滑模控制【附仿真】
✨ 长期致力于NPC型逆变器、滑模控制、超螺旋算法、模糊控制、电能质量优化研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)改进型超螺旋滑模变结构控…...
搞AI的你踩坑了吗?Ubuntu更新后GPU突然‘失联’的排查与修复实录
搞AI的你踩坑了吗?Ubuntu更新后GPU突然‘失联’的排查与修复实录 凌晨三点的实验室,显示器泛着冷光,训练了72小时的模型即将收敛。你按下回车键查看进度,却看到一行刺眼的报错:NVIDIA-SMI has failed because it could…...
SKILLS All-in-one:开源AI Agent技能库,标准化Prompt与工具函数,提升开发效率
1. 项目定位与核心价值如果你和我一样,在过去一年里深度使用过 Claude Code、ChatGPT 或者尝试搭建自己的 AI Agent 工作流,那你一定遇到过这个痛点:每次想给 AI 装个新“技能”,都得自己从头写 Prompt、设计工具调用逻辑、处理错…...
如何使用DevPod打造你的终极开源云开发环境:完整指南
如何使用DevPod打造你的终极开源云开发环境:完整指南 【免费下载链接】devpod Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker. 项目地址: https://gitcode.c…...
opencv-第四章:图像轮廓检测
OpenCV-计算机视觉技术(林伟鹏版) 第四章:图像轮廓检测 文章目录OpenCV-计算机视觉技术(林伟鹏版)前言一、图像轮廓检测概念1.概念二、图像轮廓检测1.图像二值化转换2.图像轮廓匹配3.二值图轮换轮廓检测4.图像轮廓检测…...
从数学定义到代码实现:深度解析卷积与互相关的本质差异
1. 卷积与互相关的数学定义 很多人第一次接触卷积和互相关时,都会觉得它们长得太像了。确实,从表面上看,它们都是用一个滑动窗口在输入数据上移动,然后进行加权求和。但如果你仔细研究它们的数学定义,就会发现本质上的…...
利用 JiuwenClaw AgentTeam 打造自动化研发团队
利用 JiuwenClaw AgentTeam 打造自动化研发团队 本文介绍如何通过 JiuwenClaw AgentTeam 构建自动化研发团队,实现字幕软件开发、AtomGit Issue/PR 智能处理与飞书文档同步。 目录 JiuwenClaw 平台概述 系统架构预置智能体类型 什么是 AgentTeams飞书群中添加机器人…...
Minecraft世界瘦身终极方案:MCA Selector免费工具完整使用指南
Minecraft世界瘦身终极方案:MCA Selector免费工具完整使用指南 【免费下载链接】mcaselector A tool to select chunks from Minecraft worlds for deletion or export. 项目地址: https://gitcode.com/gh_mirrors/mc/mcaselector 你是否曾为Minecraft世界日…...
GDB与QEMU实现的可逆调试技术详解
1. 可逆调试技术概述可逆调试(Reversible Debugging)是一种革命性的调试技术,它允许开发者在程序执行过程中不仅能够向前执行,还能向后追溯程序状态。想象一下,如果你在调试时发现了一个内存损坏问题,传统的…...
我让 AI 学会了“拆“App——Antigravity 逆向分析能力搭建手记
你能想象吗?对着 AI 说一句"帮我分析这个 APK",它就自己打开 IDA、拆解代码、Hook 运行时、提取密钥、还原源码……全程不用你碰一下鼠标。先说结论我给 AI 编程助手 Antigravity 装上了 4 把"瑞士军刀",让它从一个只会写…...
