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

一、为什么要对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博客

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flink Format系列(2)-CSV

Flink的csv格式支持读和写csv格式的数据&#xff0c;只需要指定 format csv&#xff0c;下面以kafka为例。 CREATE TABLE user_behavior (user_id BIGINT,item_id BIGINT,category_id BIGINT,behavior STRING,ts TIMESTAMP(3) ) WITH (connector kafka,topic user_behavior…

【01】判断素数/质数(C语言)

目录 &#xff08;1&#xff09;素数特点&#xff1a;只能被1和本身整除 &#xff08;2&#xff09;代码如下&#xff1a; &#xff08;3&#xff09;运行结果如下 ​编辑 &#xff08;4&#xff09;函数引申 &#xff08;1&#xff09;素数特点&#xff1a;只能被1和本身…

飞马座卫星

1960年代马歇尔太空飞行中心的历史显然与建造土星五号月球火箭有关。然而&#xff0c;鲜为人知的是该中心在设计科学有效载荷方面的早期工作。 Fairchild 技术人员正在检查扩展的 Pegasus 流星体探测表面。Pegasus 由马里兰州黑格斯敦的 Fairchild Stratos Corporation 通过马歇…

HarmonyOS SDK 助力新浪新闻打造精致易用的新闻应用

原生智能是HarmonyOS NEXT的核心亮点之一&#xff0c;依托HarmonyOS SDK丰富全面的开放能力&#xff0c;开发者只需通过几行代码&#xff0c;即可快速实现AI功能。新浪新闻作为鸿蒙原生应用开发的先行者之一&#xff0c;从有声资讯入手&#xff0c;基于Speech Kit朗读控件上线听…

Docker-Learn(二)保存、导入、使用Docker镜像

1.保存镜像 根据上一节内容&#xff0c;将创建好镜像进行保存&#xff0c;需要退出当前的已经在运行的docer命令行中断里面&#xff0c;可以通过在终端里面输入指令exit或者按下键盘上的 ctrlD建退出&#xff1a; 回到自己的终端里面&#xff0c;输入指令&#xff1a; docker…

基于全连接神经网络模型的手写数字识别

基于全连接神经网络模型的手写数字识别 一. 前言二. 设计目的及任务描述2.1 设计目的2.2 设计任务 三. 神经网络模型3.1 全连接神经网络模型方案3.2 全连接神经网络模型训练过程3.3 全连接神经网络模型测试 四. 程序设计 一. 前言 手写数字识别要求利用MNIST数据集里的70000张…

05 06 Verilog基础语法与应用讲解

05. 1. 位操作 计数器实验升级&#xff0c;设计8个LED灯以每个0.5s的速率循环闪烁&#xff08;跑马灯&#xff09; 1.1 方法1&#xff1a;使用移位操作符<<来控制led灯的循环亮灭 设计代码 Verilog中&#xff0c;判断操作的时候不加位宽限定是可以的&#xff0c;比如i…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

vue3:25—其他API

目录 1、shallowRef和shallowReactive 2、readonly与shallowReadonly readonly shallowReadonly 3、toRaw和markRaw toRaw markRaw 4、customRef 1、shallowRef和shallowReactive shallowRef 1.作用:创建一个响应式数据&#xff0c;但只对顶层属性进行响应式处理。2…

Java玩转《啊哈算法》纸牌游戏之小猫钓鱼

缘起性空 文章目录 缘起代码地址纸牌游戏分析代码演示优化 缘起 各位小伙伴们好呀&#xff0c;还有几天就要过年了&#xff0c;祝大家新年快乐&#xff0c;万事胜意&#xff01; 本人最近看了下《啊哈算法》&#xff0c;确实阔以。 但稍显遗憾的是&#xff0c;书籍示例代码是…

Qt QVariant类应用

QVariant类 QVariant类本质为C联合(Union)数据类型&#xff0c;它可以保存很多Qt类型的值&#xff0c;包括 QBrush&#xff0c;QColor&#xff0c;QString等等&#xff0c;也能存放Qt的容器类型的值。 QVariant::StringList 是 Qt 定义的一个 QVariant::type 枚举类型的变量&…

适用于 Windows 和 Mac 的 16 款最佳数据恢复软件

数据恢复软件是找回因硬盘损坏、病毒攻击或意外删除数据等原因而在设备上丢失的数据的最佳方法。在数字世界中&#xff0c;丢失数据是一件非常糟糕的事情&#xff0c;这会让许多人的情况变得更糟。使用最佳数据恢复软件可以减轻您必须努力恢复丢失数据的压力。它将带回您的大部…

7机器人位姿的数学描述与坐标变

由上次刚体的空间转动直接切换为机器人相关术语。 1.机器人位姿的数学描述与坐标变换 1.1位姿描述 {B}相对于{A}的姿态描述用3x3矩阵表示为&#xff1a; 式中为三个单位正交主矢量&#xff0c;分别表示刚体坐标系{B}的三个坐标轴XBYBZB在参考系{A}中的方位&#xff0c;∠XBXA表…

如何实现Vuex本地存储

在前端开发中&#xff0c;Vuex是一款非常强大的状态管理工具&#xff0c;但是默认情况下&#xff0c;Vuex的数据是存储在内存中的&#xff0c;刷新页面后数据将会丢失。这往往会导致用户在刷新页面后需要重新登录等繁琐的操作。本篇文章将教会您如何实现Vuex的本地存储&#xf…

人工智能专题:量子汇编语言和量子中间表示发展白皮书

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能专题&#xff1a;量子汇编语言和量子中间表示发展白皮书》。 &#xff08;报告出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;78页 量子计算与量子编程概述 随着社会生产力的发展&am…

sqli靶场完结篇!!!!

靶场&#xff0c;靶场&#xff0c;一个靶场打一天&#xff0c;又是和waf斗智斗勇的一天&#xff0c;waf我和你拼啦&#xff01;&#xff01; 31.多个)号 先是一套基本的判断 &#xff0c;发现是字符型&#xff0c;然后发现好像他什么都不过滤&#xff1f;于是开始poc 3213131…

相机图像质量研究(7)常见问题总结:光学结构对成像的影响--镜片固化

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…

【精选】java继承进阶——构造方法的访问特点 this、super使用

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

使用influxdb+Grafana+nmon2influxdb+nmon实时监控vps性能

Grafana可以用来实时查看linux系统的各种性能数据。 1、安装环境&#xff1a; centos 7influxdb1.7.6grafana-4.6.3-1nmon2influxdb-2.1.7nmon-16m 2、安装influxdb&#xff1a; 下载rpm包&#xff1a; influxdb官网&#xff1a;https://docs.influxdata.com/influxdb/v2.0…