Mysql进阶(sql优化和explain关键字)

news2024/9/25 19:15:55

一、为什么要对SQL进行优化?

由于业务数据量的增多,SQL的执行效率对程序的运行效率影响增大,此时就需要对SQL进行优化。

二、SQL优化的方法

1.查询sql尽量不要使用select * ,而是具体字段。

节省资源,减少开销。

2.避免在where子句中使用or来连接条件。

反例:

SELECT * FROM user WHERE id=1 OR salary=5000

正例:使用union all把两个sql结果合并。

SELECT * FROM user WHERE id=1

union all

SELECT * FROM user WHERE salary=5000

使用or可能会使索引失效,从而全表扫描。

对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描。

3.尽量使用数值替代字符串类型

正例:

主键(id):primary key优先使用数值类型int

性别(gender):0代表女,1代表男;数据库没有布尔类型,mysql推荐使用tinyint

因为引擎在处理查询和连接时会逐个比较字符串中的每一个字符,而对于数值型而言只需要比较一次就够了,字符会降低查询和连接的性能,并会增加存储开销。

4.使用varchar代替char

varchar是变长字段,按数据内容实际长度存储,可以节省存储空间;

char按声明大小存储,不足时补空格;

其次对于查询来说,在一个相对较小的字段内搜索,varchar效率更高

5.对查询进行优化,应尽量避免全表扫描,首先考虑在where及order by,group by涉及的列上建立索引。

6.应尽量避免索引失效

6.1 应尽量避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num=10 or num=20

6.2 in和not in也要慎用,否则会导致全表扫描。

如:select id from t where num in (1,2,3),对于连续的数值,能用between就不要用in,即改写为:

select id from t where num between 1 and 3;

6.3 模糊查询也将导致全表扫描

select id from t where name like '%abc%'

6.4 应尽量避免在where子句种对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)='abc'

7.提高group by语句效率

反例:先分组,再过滤。

正例:先过滤,再分组

8.清空表时优先使用truncate

truncate table 比delete速度快,且使用的系统和事务日志资源少。

delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。truncate table通过释放存储表数据所用的数据页来删除数据。

9.表连接不宜太多,索引不宜太多,一般5个以内。

联的表个数越多,编译的时间和开销也就越大。

每次关联内存中都生成一个临时表。

应该把连接表拆成几个较小的几个执行,可读性更高。

10.深度分页问题

反例:select id,name from account limit 100000,10;

正例:select id,name from account where id > 100000 order by limit 10;

详细请看下文链接:

https://blog.csdn.net/qq_43631716/article/details/117172605

11.使用explain分析SQL执行计划

三、执行计划

explain:

使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MYSQL是如何处理自己的SQL语句的。分析自己的查询语句或是表结构的性能瓶颈。

explain作用:

1.表的读取顺序

2.数据读取操作的操作类型

3.哪些索引可以被使用

4.哪些索引可以被实际使用

5.表之间的引用

explain使用:

在select语句之前增加explain关键字,执行查询会返回执行计划的信息,而不是执行SQL

EXPLAIN SELECT * FROM users WHERE id>3

explain出来的信息有12列,分别是:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra

概要描述:

1.id:选择标识符

2.select_type:表示查询的类型

3.table:输出结果集的表

4.type:表示表的连接类型

5.possible_keys:表示查询时,可能使用的索引

6.key:表示实际使用的索引

7.key_len:索引字段的长度

8.rows:扫描出的行数(估算的行数)

9.Extra列:附加信息

id:

select识别符,这是select的查询编号

id如果相同,可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高,越先执行。

 SELECT * FROM users u,test t WHERE u.id = t.id

 SELECT * FROM users u WHERE u.id = (SELECT id FROM test t WHERE id =1)

select_type:

表示查询中每个select子句的类型

1)SIMPLE(简单SELECT,不使用UNION或子查询等)

2)PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

3)SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

4)DERIVED(派生表的SELECT,FROM子句的子查询)

5)UNION(UNION中的第二个或后面的SELECT语句)

type:

对表的访问形式,表示MySQL在表中找到所需行的方式,又称“访问类型”。

常用的类型有:system>const>eq_ref>ref>range>index>ALL(从左到右,性能从好到差)

system

表只有一行记录(等于系统表),平时不会出现,可忽略不计。

const

表示通过索引一次就找到了,const用于比较primary key或者unique索引。

eq_ref

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。

ref

非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体。

range

值检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是你在where语句中出现了between、<、>、in等查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

index

Full Index Scan,index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。也就是说,虽然ALL和Index都是读全表,但Index是从索引中读取的,而ALL是从硬盘中读取的。

ALL

Full Table Scan,将遍历全表以找到匹配的行。

一般来说:得至少保证查询达到range级别,最好能达到ref

possible_keys

显示可能应用在这张表中的索引,一个或多个。

查询涉及到的字段上,若存在索引,则该索引将被列出,但不一定被查询实际使用。

key

实际使用的索引。如果为NULL,则没有索引,或者索引失效。

key_len

表中索引中使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确度的情况下,长度越短越好。

博主认为以下这篇文章能更好的帮助大家了解认识explain关键字,大家可以看看哟

【最全最详细explain讲解】explain | 索引优化的这把绝世好剑,你真的会用吗?_检查索引的使用情况 expian-CSDN博客

 

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

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

相关文章

国际物流数字化运输方式选择指南 | 箱讯科技

国际物流涉及多种运输方式&#xff0c;每种方式都有其独特的优势和适用场景。选择合适的运输方式对于确保货物安全、及时到达目的地并控制成本至关重要。以下是对六种主要国际运输方式的简要介绍和选择建议&#xff1a; 国际快递&#xff1a;适用于小件、高价值或急需的货物。…

Response对象实现设置响应数据

1.设置响应数据功能 2.response设置重定向 重定向是一种资源跳转方式&#xff0c;类似于转发&#xff0c;但存在不同&#xff0c;转发是资源a处理了一部分&#xff0c;再跳转到资源b继续处理&#xff0c;最后响应。 实现方式一&#xff1a; resp.setStatus(302); resp.setHe…

力扣:42. 接雨水 84.柱状图中最大的矩形(单调栈,双指针)

这两道题解题思路类似&#xff0c;一个是单调递增栈&#xff0c;一个是单调递减栈。本篇博客给出暴力&#xff0c;双指针和单调栈解法。 42. 接雨水 题目&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后…

MQTT在linux下服务端和客户端的应用

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级、开放标准的消息传输协议&#xff0c;设计用于受限设备和低带宽、不稳定网络的通信。 MQTT的一些关键特点和概念&#xff1a; 发布/订阅模型&#xff1a; MQTT采用发布/订阅&#xff08;Publ…

【typescript】特殊符号用法(?:)(??)(?.)(!)(!!)

一. 问号冒号&#xff08;?:&#xff09; 1.可以作为对象类型的可选属性&#xff0c;如&#xff1a; interface Person{name : string;age?: number; }const person1 : Person {name:"zien"} const person2 : Person {name:"sad", age:18} console.l…

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第四章时&#xff0c;笔者使用了Odin插件&#xff0c;对Item和ItemDatabase的SO文件进行了一些优化&#xff0c;使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动&#xff0c;整体代码量减少…

蓝桥杯-求阶乘-python

问题描述 满足N!的末尾恰好有K个0的最小的N是多少&#xff1f; 如果这样的N不存在输出一1。 思路解析 末尾的0是由10产生的&#xff0c;而10是由质数2和5产生的 在求阶乘的过程中&#xff0c;只要是偶数就会有2&#xff0c;而5相对2更少&#xff0c;所以对于10的数量我们可以…

【分享】Word快捷键--Tab键的应用技巧

在使用word编辑文档时&#xff0c;想必大家一定经常用到【Tab】这个快捷键&#xff0c;今天来分享几个Tab键的应用技巧&#xff0c;这些技巧在文档排版中大有用处&#xff0c;可以大大提高我们的操作效率。 1.段首空两格 写文章时&#xff0c;只需按下【Tab】键就可以自动缩进…

Java串口通信技术探究2:RXTX库单例测试及应用

目录 一、创建串口工具类二、串口工具测试三、运行时会遇到的错误JVM崩溃无法找到指定的类 本文主要介绍了Java串口通信技术探究&#xff0c;重点分析了RXTX库单例测试以及串口工具的使用。通过实例演示了如何使用SerialPortTool类进行串口操作&#xff0c;包括打开串口、关闭串…

MySQL篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、BLOB 和 TEXT 有什么区别?二、MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?三、MyISAM 表格将在哪里存储,并且还提供其存储格式?四、MySQL 如何优化 DISTINCT?五、如何显示前 50 行?前言 前些天发现了一个巨牛的人…

ProtonMail邮箱怎么样?国内有什么替代品?

ProtonMail作为业界知名的加密邮箱提供者&#xff0c;其安全性、隐私保护等特性让不少追求私密通信的用户趋之若鹜。然而对于国内用户而言&#xff0c;ProtonMail可能并非最佳选择&#xff0c;受限于许多因素&#xff0c;从语言支持到服务器位置再到可访问性&#xff0c;都可能…

parse库,一个优雅的python库

前言 在Python中&#xff0c;format方法和f-strings是两种常用的字符串插值方法。 name "Haige" age "18" print(f"{name} is {age} years old.")# Haige is 18 years old.而如果是要从字符串中提取期望的值呢&#xff1f;相信很多人的第一或…

tkinter绘制组件(41)——菜单按钮

tkinter绘制组件&#xff08;41&#xff09;——菜单按钮 引言布局函数结构按钮部分菜单显示完整代码函数 效果测试代码最终效果 github项目pip下载结语 引言 TinUI5的新控件&#xff0c;菜单按钮&#xff0c;menubutton。 这是一个与TinUI菜单&#xff08;menubar&#xff0…

【C++】基础知识讲解(引用、内联、auto,基于范围for循环)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 引用 概念 特性 使用场景 作参数 作返回值 传值、传引用效率比较 引用和指针的区别 内联函数 概念…

excel 导出 The maximum length of cell contents (text) is 32767 characters

导出excel报错。错误日志提示&#xff1a;:The maximum length of cell contents (text) is 32767 characters 排查后&#xff0c;发现poi有单元格最大长度校验&#xff0c;超过32767会报错。 解决方案&#xff1a; 通过java反射机制&#xff0c;设置单元格最大校验限制为Int…

Skywalking 应用笔记

概念 Skywalking是一款分布式的系统 性能监视工具&#xff0c;专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是一款 观察性的分析平台和应用性能管理系统&#xff0c;提供了 分布式追踪、性能指标分析、应用服务依赖分析、可视化一体化等解决方…

CV | SAM在医学影像上的模型调研【20240207更新版】

本文主要是SAM&#xff08;Segment Anything&#xff09;在医学影像上的数据集&#xff0c;模型及评估方法调研【持续更新】~ 1.开源数据集 可参考这篇【数据集 | 基于计算机视觉的医学影像处理数据集_CSDN博客】 2.算法模型 2023.04_SAM 论文&#xff1a;2018.08.05v_Segm…

Win32 SDK Gui编程系列之--弹出式菜单

1.弹出式菜单 例如,在命令提示窗口中点击鼠标右键,会出现如下图所示的弹出菜单(下拉菜单)。 这种弹出式菜单的实现很简单。不创建菜单栏,用CreatePopupMenu函数创建的菜单是最顶端的菜单就可以了。 菜单的显示使用TrackPopupMenu函数进行。 例如,点击鼠标右键显示弹出…

尚硅谷 Java 基础实战—Bank 项目—实验题目 3

实验题目 修改 withdraw 方法以返回一个布尔值&#xff0c;指示交易是否成功。 实验目的 使用有返回值的方法。 提示 修改 Account 类 修改 deposit 方法返回 true&#xff08;意味所有存款是成功的&#xff09;。修改 withdraw 方法来检查提款数目是否大于余额。如果amt小…

十七、vben合并行后操作按钮如何合并

上期我们说了如何在table内部合并行,行内的内容都是字符串,那么如果是多个操作按钮呢,他们是如何合并的,事件是怎么触发的,怎么写呢。 先看效果图 数据上也是和上期一样有9条信息。 下面来看一下我们的具体实现 一、在template里面写table <BasicTable:showIndexCol…