SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因

1)索引失效
索引分为单索、复合索引。

在这里插入图片描述
四种创建索引方式

在这里插入图片描述

create index index_name on user (name);
create index index_name_2 on user(id,name,email);
2)查询语句较烂
3)关联查询太多join,sql设计不合理
4)服务器问题。

2. explain使用

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

2.1 ID 参数

select 查询的序列号,包含一组数字,表示查询中执行 select 子句或操作表的顺序。三种情况:
【1】id 相同:执行顺序由上而下;

explain select t2.* from t1,t2,t3 where t1.id = t2.id and t1.id = t3.id and t1.other_column = '';

在这里插入图片描述

【2】id 不同:如果是子查询,id 序号会递增,id 越大优先级越高,越先被执行;

explain select t2.* from t2 where id = (select id from t1 where id = (select t3.id from t3 where t3.other_column = ''));

在这里插入图片描述

【3】id 相同不同同时存在:id 如果相同,可以认为是一组,由上往下执行;在所有组里 id 越大,优先级越高,越先执行;

explain select t2.* from (select t3.id from t3 where t3.other_column = '') s1,t2 where s1.id = t2.id;

在这里插入图片描述

2.2select_type 数据读取操作类型

【1】simple
简单的 select 查询,查询中不包含子查询或者 UNION;
【2】primary
查询中若包含任何复杂的自查询,最外层查询为 PRIMARY;
【3】subquery
在 SELECT 或 WHERE 中包含子查询;
【4】derived
在 FROM 列表中包含的子查询被标记为 DERIVED(衍生)MySQL 会递归执行这些子查询,把结果放进临时表;
【5】union
若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION,若 UNION 包含在 FROM 子句的子查询,则外层SELECT 将被标记为 DERIVED;
【6】union result
从 UNION表中获取结果的 SELECT;

2.3 type 访问类型

从最好到最差:system>const>eq_ref>ref>range>index>ALL,一般达到 rang 级别,最好达到 ref 级别。

【1】system:表只有一行记录(系统表),平时不会出现;
【2】const:表示通过索引一次就能找到,const用于比较 primary和 unique索引。因为只匹配一行数据,所以很快;
【3】eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常用于主键或唯一索引扫描。eg:CEO部门;

【4】ref:非唯一性索引扫描,返回匹配某个单独值的所有行;
【5】rang:只检索给定范围的行,使用一个索引来选择行。一般where语句中出现between、<、>、in等的查询。这种范围扫描索引比全表扫描要好,因为只需开始索引的某一点,而结束另一点,不用扫描全部索引;
【6】index:Full Index Scan,index与 ALL区别为 index类型只遍历索引树,索引文件通常比数据文件小。index从索引中读取,而All是从硬盘读取;
【7】ALL:从磁盘中读取

2.4 possible_keys 与 key

possible_keys:显示可能应用到这张表中的索引,一个或多个,查询字段上若存在索引则列出来,但不一定被查询实际使用。
key:实际使用的索引,如果该值为NULL,则没有使用索引;如果查询中使用了覆盖索引,则该索引仅出现在 key列表中。
【覆盖索引】:就是 select后面的字段都具备索引,提高了查询效率,前提顺序、个数都要一致;
【理解方式一】:就是 select的数据列从索引中就能够获取到,不必读取没有必要多余的数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建索引覆盖。
【理解方式二】:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个数据行,毕竟索引叶子节点存储了它们索引的数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了。一个索引包含了(或覆盖了)满足查询结果的数据就叫做覆盖索引。
【使用覆盖索引注意】:如果使用覆盖索引,一定注意 select列表中只取需要的列,不可使用select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降。

2.5 key_len

表示索引中使用的字节数,可通过该列查找出使用索引的长度。在不损坏精准性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际长度,即 key_len是根据表定义实际计算出来的,不是通过表内检出来的。

2.6 ref

显示索引的那一列被使用,如果可能的话,是一个常数。那些列或常量被用于查找索引上的值。

2.7 rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录的行数。常用于优化时查看,使用该值与实际返回的行数进行比较,如果相差很大,则需要调优。

2.8 Extra

包含不适合在其他列中显示,但十分重要的信息。
【1】Using fileSort:说明 MySQL会对数据使用一个外部的索引排序,而不是按照表内索引进行读取。MySQL无法利用索引完成的排序操作称为“文件排序”。(出现表示不好)
【2】Using temporary:使用临时表保存中间结果,MySQL在查询结果排序时使用临时表。重用于排序 order by和分组查询 group by。
【3】Using index:表示相应的 select操作中使用了覆盖索引(convering index),避免访问了表的数据行,效率不错!

【4】using where,using index:查询的列被索引覆盖,并且 where筛选条件是索引列之一但是不是索引的前导列,Extra中为Using where; Using index,意味着无法直接通过索引查找来查询到符合条件的数据;

查询的列被索引覆盖,并且where筛选条件是索引列前导列的一个范围,同样意味着无法直接通过索引查询到符合条件的数据

【5】NULL(既没有Using index,也没有Using where Using index,也没有using where):查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引,Extra中为NULL(没有信息)

【6】Using where:查询条件中使用了索引查找。查询的列未被索引覆盖,where筛选条件非索引的前导列,Extra 中为 Using where。order_id 也是索引。

查询的列未被索引覆盖,where筛选条件非索引列,Extra中为Using where。意味着通过索引或者表扫描的方式进行 where条件的过滤,反过来说,也就是没有可用的索引查找,当然这里也要考虑索引扫描+回表与表扫描的代价。这里的 type都是 all,说明MySQL认为全表扫描是一种比较低的代价。

【7】Using index condition:查询的列不全在索引中,where条件中是一个前导列的范围

查询列不完全被索引覆盖,查询条件完全可以使用到索引(进行索引查找)

【8】Using join buffer:使用了连接缓存。
【9】impossible where:where子句总是false,不能用来获取任何元素。
【10】select tables optimized away:在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX操作。
【11】distinct:优化 distinct操作。在找到第一匹配的时候就停止找同样的动作。

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

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

相关文章

计算机组成原理 数据的表示与运算

文章目录 数据的表示与运算数据表示定点数的表示与运算定点数的表示无符号数有符号数定点整数定点小数四码反码补码移码 总结 定点数的运算算术移位原码反码补码总结 逻辑位移循环位移总结 加减运算原码加减法补码加减法 溢出判断采用一位符号位 浮点数的表示与运算表示IEEE 75…

使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理

原理 拉普拉斯算子是一个二阶导数算子&#xff0c;用于图像处理中的边缘检测。它通过计算图像亮度的二阶空间导数来工作&#xff0c;能够突出显示图像中的快速变化区域&#xff0c;如边缘。 图像锐化的原理&#xff1a; 图像锐化是指增强图像中的边缘和细节&#xff0c;使图像…

Linux:apache优化(7)—— 日志分割|日志合并

作用&#xff1a;随着网站访问量的增加&#xff0c;访问日志中的信息会越来越多&#xff0c; Apache 默认访问日志access_log单个文件会越来越大&#xff0c;日志文件体积越大&#xff0c;信息都在一个文件中&#xff0c;查看及分析信息会及不方便。 分割 实现方式&#xff1a…

Linux操作系统极速入门[常用指令]

linux概述&#xff1a; Linux是一套免费使用和自由传播的操作系统 我们为什么要学&#xff0c;Linux&#xff1f; 主流操作系统&#xff1a; linux系统版本&#xff1a; 内核版&#xff1a; 由linux核心团队开发&#xff0c;维护 免费&#xff0c;开源 负责控制硬件 发行版&…

如何在MAC OS中的XCODE下添加 <bits/stdc++.h>

mac上使用的编译器是Clang&#xff0c;但是没有万能头文件bits/stdc.h\&#xff0c;本文介绍如何添加万能头文件 Xcode 版本&#xff1a;15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…

【Spark精讲】SparkSQL的RBO与CBO

Spark SQL核心:Catalyst Spark SQL的核心是Catalyst查询编译器&#xff0c;它将用户程序中的SQL/Dataset/DataFrame经过一系列操作&#xff0c;最终转化为Spark系统中执行的RDD。 Catalyst组成部分 Parser &#xff1a;用Antlr将SQL/Dataset/DataFrame转化成一棵未经解析的树…

gzip引入后node_modules中.cache compression-webpack-plugin占用内存过多

1.Gzip Gzip&#xff08;GNU zip&#xff09;是一种常见的文件压缩格式和压缩算法&#xff0c;通常用于在 Web 服务器上对静态资源文件进行压缩&#xff0c;以减小文件大小并加快文件传输速度。在前端开发中&#xff0c;经常会使用 Gzip 压缩来优化网站的性能。 Gzip 压缩通过…

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制&#xff1f;二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…

【数据结构】图论与并查集

一、并查集 1.原理 简单的讲并查集&#xff0c;就是查询两个个元素&#xff0c;是否在一个集合当中&#xff0c;这里的集合用树的形式进行表示。并查集的本质就是森林, 即多棵树。 我们再来简单的举个例子: 假设此时的你是大一新生&#xff0c;刚进入大学&#xff0c;肯定是…

机器学习基本概念及模型简单代码(自用)

监督学习 监督学习是机器学习的一种方法&#xff0c;其中我们教导模型如何做出预测或决策&#xff0c;通过使用包含输入和对应输出的已标注数据集进行训练。这种方法的关键特点是利用这些标注数据**&#xff08;即带有正确答案的数据&#xff09;**来指导模型的学习过程。 一言…

JavaScript(简写js)常用事件举例演示

目录 1.窗口事件onblur :失去焦点onfocus:获得焦点onload:窗口加载事件onresize:窗口大小缩放事件 二、表单事件oninput &#xff1a;当文本框内容改变时 &#xff0c;立即将改变内容 输出在控制台onchange&#xff1a; 内容改变事件onclick&#xff1a;鼠标单击时触发此事件 三…

VUE——IDEA 启动前端工程VS文件启动前端工程

IDEA 启动前端 目录 前言一、打开控制台二、输入npm install三、依赖下载完之后&#xff0c;输入npm run dev&#xff0c;运行前端项目1、IDEA启动前端工程2、文件目录启动前端工程 四、点击http://localhost:8080后续敬请期待 前言 启动已有的vue前端项目 一、打开控制台 选…

网络安全-真实ip获取伪造与隐藏挖掘

目录 真实ip获取应用层网络层网络连接TOAproxy protocol ip伪造应用层网络层TOA攻击proxy protocol 隐藏代理 挖掘代理多地ping历史DNS解析记录国外主机解析域名网站RSS订阅网络空间搜索引擎 总结参考 本篇文章学习一下如何服务如何获取真实ip&#xff0c;隐藏自己的ip&#xf…

docker 部署教学版本

文章目录 一、docker使用场景及常用命令1&#xff09;docker使用场景2&#xff09;rocky8(centos8)安装 docker3&#xff09;docker 常用命令补充常用命令 二、 单独部署每个镜像&#xff0c;部署spring 应用镜像推荐&#xff08;2023-12-18&#xff09;1、 安装使用 mysql1.1 …

elasticsearch系列五:集群的备份与恢复

概述 前几篇咱们讲了es的语法、存储的优化、常规运维等等&#xff0c;今天咱们看下如何备份数据和恢复数据。 在传统的关系型数据库中我们有多种备份方式&#xff0c;常见有热备、冷备、全量定时增量备份、通过开发程序备份等等&#xff0c;其实在es中是一样的。 官方建议采用s…

中间件系列 - Redis入门到实战(高级篇-多级缓存)

前言 学习视频&#xff1a; 黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 学习目标 JVM进程缓存Lua语法入…

微软发布安卓版Copilot,可免费使用GPT-4、DALL-E 3

12月27日&#xff0c;微软的Copilot助手&#xff0c;可在谷歌应用商店下载。目前&#xff0c;只有安卓版&#xff0c;ios还无法使用。 Copilot是一款类ChatGPT助手支持中文&#xff0c;可生成文本/代码/图片、分析图片、总结内容等&#xff0c;二者的功能几乎没太大差别。 值…

超详细的企业单位B级数据机房设计方案

一、项目概述 本项目旨在为企业单位构建一个符合B级标准的数据机房&#xff0c;以满足企业信息化建设的需要。项目包括机房基础设施、配电系统、空调系统、消防系统、监控系统、照明系统、网络设备等方面的设计和施工&#xff0c;以确保机房的安全、稳定和高效运行。 二、设计…

数据库索引、三范式、事务

索引 索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树&#xff08;B-tree&#xff09;。 常见索引原则有 选择唯一性索引&#xff1a;唯一性索引的值是唯…

【k8s】deamonset文件和说明

目录 deamonset的相关命令 deamonset的定义 deamonset的使用场景 deamonset的例子 deamonset字段说明 serviceAccountName DaemonSet的结构及其各个部分的作用 deamonset的相关命令 #查看<name-space>空间内有哪些deamonset kubectl get DaemonSet -n <na…