【MySQL】SQL语句优化

文章目录

  • 索引属性限定
  • 索引语句
  • 高性能 SQL
  • 数值类型
  • Explain

索引属性限定

  1. 避免索引字段使用 null
  • B+ 树索引必须先进行比较当前值后再确定下一步查找范围,null 值只能全盘扫描。
  • 包含 null 值的列无法作为索引,聚合索引中只要有一列存在 null 就无法使用索引。
  1. 避免使用空值判断
  • 避免使用 !=、<>、NOT、is null、is not null、in、not in 操作符,输入范围不确定,会进行全盘扫描。
  1. 避免在索引字段上使用函数或表达式操作
  • 索引保存的是原数值,对索引字段使用函数或表达式操作,会导致引擎放弃使用索引而进行全表扫描。
  • 算数函数:加减乘除、求绝对值、求余、四舍五入。
  • 字符串:拼接、长度、大小写、字符替换、字符串截取、日期。
  • 转换函数:CAST类型转换。
  1. 在 WHERE/ORDER BY 添加索引
  • 在 SELECT 输出栏添加索引没有意义,应该在选择条件 WHERE、ORDER BY 上添加索引。
  1. 前缀索引
  • 使用某个字段中字符串的前几个字符建立索引,减小索引字段大小,提高索引的查询速度。
  1. 覆盖索引
  • 从二级索引中查询得到记录,不需要通过聚簇索引查询获得,避免回表操作。
  1. 自增主键
  • 自增主键,每次插入的新数据都会按顺序添加到当前索引节点,不需要移动已有的数据。当页面写满,就会自动开辟一个新页面。
  • 非自增主键,每次插入主键的索引值都是随机的,可能会插入到现有数据页中间,甚至需要从一个页面复制数据到另外一个页面,称为页分裂。页分裂还有可能会造成大量的内存碎片,导致索引结构不紧凑,影响查询效率。

索引语句

  1. 避免使用 select *
  • 会进行全盘扫描,推荐使用具体的查询字段,建立索引,提高效率。
  1. 复杂子查询使用 exists 替代 in
  • in 会先执行子查询保存到加索引的临时表,再和外主表做笛卡尔积,再通过条件筛选数据加入结果集,适用于子查询简单场景。
  • exists 会先遍历外主表,每次遍历时,在子表根据索引匹配查找。适用于外表为小表,用小表驱动大表,子查询表越小效率越高。
  1. 使用 between 替代 in
  • 对于连续的数值,能用 between 就不要用 in,in 不走索引。
  1. 使用 order by 需要添加索引
  • order by 尽量不使用,若使用要对使用的字段添加索引。
  • order by 避免使用计算表达式。
  1. 避免 or 导致索引失效
  • or 进行条件判断,所有字段必须都添加索引,否则会全盘扫描。
  • or 后的字段可以单独添加索引,防止索引失效。

高性能 SQL

  1. 使用 unionall 替代 union
  • union 会在结果集合并后做排序和唯一性过滤。
  • unionall 避免合并后排序,可以通过数据源自身保证唯一性。
  1. 多用 limit
  • limit 读取固定数量的记录,提高查询效率。
  • limit 数据量过高时,先通过 where 设定索引起始位置,再用 limit 限定数量进行分页。
  • limit 数据量过多时,使用 between 设置索引范围,替换 limit。
  1. 使用批量插入
  • 批量插入比单条插入效率高。insert into person(name,age) values(‘xboy’, 14), (‘xgirl’, 15),(‘nia’, 19);
  1. group by 避免排序
  • group by 默认会对结果自动排序,通过添加 order by null 避免排序。
  • group by 的字段最好添加索引,可以避免创建临时表。
  • having 在检索出所有记录后再对结果过滤,通过 where 提前过滤字段。
  1. left join 左表使用小表
  • left join 返回主表所有字段。右表非空时,left join = inner join。
  • left join 主表作为驱动表,左表应选择小表,或使用 where 过滤字段,左表太大循环次数越多。
  1. like 使用 左 like 效率更高:LIKE "A%"

数值类型

  1. 合理使用数值型字段
  • 数据库字段使用字符型,存储引擎处理查询时会逐个比较字符,降低低查询性能,数值型数据只需要比较一次。
  1. 合理使用 varchar
  • char、varchar 都用于存储字符类型数据。
  • char 类型实际存储的字符长度小于其定义规格,会在尾部用空格补齐,对于小的字符串数值使用 varchar 可以节省空间。

Explain

  • EXPLAIN 执行计划,只能用于 select 语句前。
  • 主要字段:type、key、rows。
mysql> explain select * from actor;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | actor | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
  1. id 执行编号,语句执行顺序,值越大,语句优先级越高,越先执行,有几个 select 就有几个 id。
  2. select_type 查询类型,普通查询、联合查询、子查询。
  • SIMPLE:简单查询,不包含子查询,没有使用UNION、UNION ALL、DISTINCT、GROUP BY、HAVING、LIMIT等关键字。
  • PRIMARY:表示查询中包含一个或多个子查询。MySQL 会先执行主查询,再执行子查询。
  • SUBQUERY:表示查询中的第一个子查询,子查询包含在 SELECT 列表中的子查询或 WHERE 子句中的子查询。
  • DERIVED:表示查询中的子查询,派生表。MySQL 会先执行子查询,然后将结果存储在一个临时表中,再执行主查询。
  • UNION:表示将多个查询的结果集合并成一个结果集。
  • UNION RESULT:表示查询中的UNION操作的结果集。
  • DEPENDENT SUBQUERY:表示查询中的子查询依赖于外部查询的结果集。MySQL 会根据外部查询的结果集来执行子查询。
  • DEPENDENT UNION:表示查询中的 UNION 操作依赖于外部查询的结果集。MySQL 会根据外部查询的结果集来执行UNION操作。
  • DEPENDENT UNION RESULT:表示查询中的 UNION 操作的结果集依赖于外部查询的结果集。MySQL 会根据外部查询的结果集来执行 UNION 操作。
  1. type 访问类型,至少达到 range 索引范围扫描,最好能达到 ref 非唯一索引扫描。效率从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • system:表只有一行记录(等于系统表),const 的特例,平时不会出现。

  • const:结果只有一行匹配。

  • eq_ref :唯一索引扫描,使用非 null 值的唯一索引。

  • ref:非唯一索引扫描,使用普通、非主键、非唯一的索引,最好能达到。

  • ref_or_null:某字段既需要关联条件,也需要null值。

  • index_merge:在查询过程中需要多个索引组合使用

  • unique_subquery:使用唯一索引,类似 index_subquery。

  • index_subquery:利用索引关联子查询,不再扫描全表。

  • range:索引范围扫描,使用索引查询时限制了范围,避免了全索引扫描,适用的操作符: =, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or, IN() 。

  • index:全索引扫描,使用了覆盖索引,或使用索引进行排序,避免了数据的重排。

  • all:全表扫描,一般情况下出现这样的sql语句而且数据量比较大的话那么就需要进行优化。

  1. table 表名或别名。
  2. possible_keys 表中可以使用的索引,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
  3. key 实际使用的索引,为 null 表示没有使用索引。
  4. key_len 索引字段的长度。
  5. ref 查找使用的索引的列或常量。
  6. rows 估算查找所需记录需要读取的行数。
  7. extra 额外信息。
  • using filesort:无法利用索引进行排序,只能利用排序算法进行排序。
  • using temporary:建立临时表来保存中间结果,查询完成之后把临时表删除。
  • using index:覆盖索引,直接从索引中读取数据,而不用访问数据表。
  • using where:使用 where 进行条件过滤。
  • using join buffer:使用连接缓存。
  • impossible where:where 语句的结果总是 false。
  1. partitions 如果查询是基于分区表的话,会显示查询将访问的分区,MySQL 8 新增。
  2. filtered 按表条件过滤的行百分比。 rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的 id 值比当前表 id 值小的表)MySQL 8 新增。

高性能SQL
SQL优化1
SQL优化2
SQL优化3
SQL优化4
SQL

Explain
Explain结果字段

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

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

相关文章

mac安装jdk

1、下载jdk&#xff08;我的电脑要下载arm版&#xff0c;截图不对&#xff09; Java Downloads | Oraclehttps://www.oracle.com/java/technologies/downloads/#jdk17-mac 2、双击安装

PostgreSQL 的 Replication Slot分析研究

PostgreSQL 9.4 开始支持Replication Slot新功能。对于Replication Slot&#xff0c;文档上介绍的不多&#xff0c;乍一看让人比较难理解是做什么的。其实&#xff0c;Replication Slot的出现&#xff0c;主要是为最终在PG内核实现逻辑复制和双向复制铺路的&#xff08;目前&am…

详解 Diffusion (扩散) 模型

扩散模型是跨不同深度学习领域使用的生成模型。目前&#xff0c;它们主要用于图像和音频生成。最值得注意的是&#xff0c;这些模型是令人印象深刻的图像生成模型&#xff08;例如 Dalle2 和稳定扩散&#xff09;背后的驱动力。我相信您已经看过这些模型生成的闪烁图像。令人惊…

线性表操作的实现--单链表(链式存储结构)

本文参考朱战力老师的数据结构与算法--使用C语言一书 目录 文章目录 前言 一、链表是什么&#xff1f; 二、具体实现 1.单链表的定义 2.初始化ListInitiate&#xff08;SLNode **head&#xff09; 3.求当前元素的个数ListLength&#xff08;SLNode *head&#xff09; 4.插入Lis…

生鲜加工废水处理设备构造工艺流程

诸城市鑫淼环保小编带大家了解一下生鲜加工废水处理设备构造工艺流程 1.机械格栅设备&#xff1a;生鲜水产品加工废水首先经过车间排放到收集池&#xff0c;然后利用机械格栅设备&#xff0c;它能拦截并去除大颗粒悬浮物&#xff0c;防止后续处理过程中的水泵堵塞问题。 2.调节…

8.2 矢量图层点要素单一符号使用一

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染简单标记(Simple Marker)QGis代码实现 SVG标记&#xff08;SVG marker&#xff09;QGis代码实现 总结 前言 上一篇教程对矢量图层符号化做了一个整体介绍&#xff0c;并以点图层为例介绍了可以使用的渲染器&am…

c语言进制的转换16进制转换2进制

c语言进制的转换16进制转换2进制 c语言的进制的转换 c语言进制的转换16进制转换2进制一、16进制的介绍二、八四二一法则三、16进制转换2进制 一、16进制的介绍 十六进制&#xff1a; 十六进制逢十六进一&#xff0c;所有的数组是0到9和A到F组成&#xff0c;其中A代表10&#x…

linux vim 删除多行

使用linux服务器&#xff0c;免不了和vi编辑打交道&#xff0c;命令行下删除数量少还好&#xff0c;如果删除很多&#xff0c;光靠删除键一点点删除真的是头痛&#xff0c;还好Vi有快捷的命令可以删除多行、范围。 删除行 在Vim中删除一行的命令是dd。 以下是删除行的分步说明…

【网络原理】| 应用层协议与传输层协议 (UDP)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;javaEE初阶 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 一、应用层协议二、传输层协议&#xff08;UDP协议&#xff09; 一、应用层协议 应用层是和代码直接相关的一层&#xff0c;决定…

Leetcode第 368 场周赛

元素和最小的山形三元组 II 预处理前缀和后缀最小值,记为pre[i]和sa[i] 对于当前编号i&#xff0c;如果前面的最小值和后面的最大值都小于nums[i],则记录ans[i] nums[i]pre[i-1]sa[i1] 结果输出最小的ans[i]即可。 合法分组的最少组数 统计每一个数字出现的次数。将每一个数…

电能计量与远程抄表的应用

摘要&#xff1a;结合当前电力企业实际的发展概况&#xff0c;可知电力活动开展中对于性能可靠的电能计量及远程抄表依赖程度高&#xff0c;需要注重它们实际应用范围的扩大&#xff0c;满足电力企业长期稳定发展的实际需求。基于此&#xff0c;本文将对电能计量与远程抄表应用…

【前端】Webpack5中Html和CSS的压缩打包

1.Webpack5简介 1.1.Webpack简介 &#xff08;1&#xff09;webpack的发展历程 2012.3—webpack&#xff08;问世&#xff09; 2014.2—webpack1 2016.12—webpack2 2017.6—webpack3 2018.2—webpack4 2020.10—webpack5&#xff08;要求node版本10.13&#xff09; &a…

微信小程序导航退回及跳转 传参(navigateBack,navigateTo)

一、uniapp navigateBack 退回上一级 当前页面-传递参数 uni.$emit(update, params)uni.navigateBack({delta: 1});退回的页面-接收参数 可以写在 onLoad 和 onShow 里面 onLoad(o) {uni.$on(update, function(e) {//参数e}}onShow() {}返回前两级 uni.navigateBack({delta: 2}…

Visual Studio Professional 2019 软件安装教程(附安装包下载)

Microsoft Visual Studio 是一个非常强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于 Windows 上的 .NET 和 C 开发人员。它提供了一系列丰富的工具和功能&#xff0c;可以提升和增强软件开发的每个阶段。 Visual Studio IDE 是一个创意启动板&#xff0c;可…

uniapp中 background-image 设置背景图片不展示问题

有问题 <view class"file-picker__box jsz" tap"jszxszUpload(jsz)"></view>.jsz {background-image: url(../../static/example_drive.png); }解决1 <view class"file-picker__box jsz" :style"{ background-image: url(…

JS小数运算精度丢失的问题

工作中会不会经常会碰到一些数据指标的计算&#xff0c;比如百分比转化&#xff0c;保留几位小数等&#xff0c;就会出现计算不准确&#xff0c;数据精度丢失的情况。通过这篇分享借助第三方库能够轻松解决数据精度丢失的问题。 一、场景复现 JS数字精度丢失的一些常见问题 /…

SpringBoot+SpringMVC+MybatisPlus

文章目录 SpringBootSpringMVCMybatisPlus怎样在SpringBoot中引入SpringMVC?首先看下引入的依赖创建数据库表创建DO类创建MyBatisPlus动态代理接口创建controller控制器接收http请求创建SpringBoot配置文件application.yml最后创建启动类 SpringBootSpringMVCMybatisPlus 怎样…

cuda卸载

去查看你的电脑显卡对应的cuda版本&#xff0c;不然还是一整个用不到gpu的情况嘿嘿. 啊啊啊啊打开控制面板看一下&#xff0c;驱动不要乱卸载&#xff1a; 这些东西不能全部卸载了哦&#xff0c;只能卸载含有“CUDA”的那几个&#xff08;其实其他的可能也没有用 但是不懂的哇 …

Linux Shell :正则表达式

先来看一句 Shell 代码&#xff1a; dpkg --list | grep -E -o cuda-documentation-[0-9\-]*dpkg --list&#xff1a;dpkg 是 Debian 系列 Linux 发行版&#xff08;如 Ubuntu&#xff09;的包管理工具。--list 选项用于列出所有已安装的软件包。 | &#xff1a;这是一个管道…

关于路由转发

路由表的作用 路由表的作用&#xff1a;目标网络匹配路由表&#xff0c;从相应网络转发&#xff1b;不匹配路由表&#xff0c;丢弃或转发至默认路由器。 路由转发的原理 根据IP地址找到目标网络&#xff0c;由应路由器解封装查看目标网络是否可达&#xff0c;重新封装进行转…