Sql查询优化--索引设计与sql优化(包含慢查询定位+explain解释计划+左匹配原则+索引失效)

        本文介绍了数据库查询的索引优化方法,依次介绍了慢查询语句定位方法、索引设计与sql语句优化方法,并介绍了左匹配原则和索引失效的场景,最后介绍了explain执行计划要怎么看以调整检验索引设计是否生效和效率情况,创新介绍了如何以业务板块及大表为切入点,系统性设计索引,用最少的索引覆盖最多的查询语句。在实践中将整个业务板块的多个大表查询和复杂查询sql优化从40s以上优化到3s以内,保障系统正常运行。

优化前:43秒

优化后:4秒

一、慢查询定位

在排除前端请求超时时长设置和nginx负载以后,可以慢查询定位找到查询耗时长的sql语句。

1、Oracle 慢查询耗时定位

select *from (select sa.SQL_TEXT "执行 SQL",sa.EXECUTIONS "执行次数",round(sa.ELAPSED_TIME / 1000000, 2) "总执行时间",round(sa.ELAPSED_TIME / 1000000 / sa.EXECUTIONS, 2) "平均执行时间",sa.COMMAND_TYPE,sa.PARSING_USER_ID "用户 ID",u.username "用户名",sa.HASH_VALUEfrom v$sqlarea saleft join all_users uon sa.PARSING_USER_ID = u.user_idwhere sa.EXECUTIONS > 0order by (sa.ELAPSED_TIME / sa.EXECUTIONS) desc)where rownum <= 50;

2、mysql 慢查询耗时定位

查询是否开启慢查询日志:show variables like ‘slow_query_log’;

  • 开启慢查询sql:set global slow_query_log = 1/on;
  • 关闭慢查询sql:set global slow_query_log = 0/off;

二、索引设计方法

1、单索引和联合索引

      联合索引的优先级大于普通索引。索引相当于路线,即使一张表有多个索引,一个查询(子查询)只能走一个索引,走了其中一个索引就相当于走了一条路,不会同时走多个索引。

2、最大区分度

根据业务,where、group by、order等最常用到的关键词,能最大程度区分数据,记录中最具代表性质的字段。如status之类的字段则不便于建立索引。

3、遵循左匹配原则

索引index(a,b,c);   

查询语句where b=1 and c =3【不走索引】

查询语句where a=1 and c =3【走部分索引,索引存在中断】

查询语句where b=1 and a=3【走部分索引,左匹配原则和索引列的顺序有关,和查询列的顺序无关,因sql有查询优化器,可以调整sql执行方法】

查询语句where b=1 and a=3 and c=9 【走索引】

4、根据业务设计(**实战重点**)

(1)一张表的索引并非越多越好,索引过多对空间造成浪费,在新增和删除、修改时浪费效率。一张表建议不超过5个索引。

(2)首先根据一块业务找到涉及到的表,找到关联left join的关键字。

(3)一块业务流程中的用到的所有复杂查询语句、常用查询语句、大表查询语句、慢查询语句,提取出来分析(也可用慢查询分析)。

(4)关注where、order、group by、select、left join、实际数据记录重要性质区分的字段。各个sql语句的字段按字典序进行排序,关注每个sql语句涉及字段的交集。

(5)以交集字段建立联合索引,实现尽可能少的建立索引,尽可能多的sql语句能走索引查询。

Eg:

Sql_1 语句:select a from table_1 where a=1 and b=1 and c=2 and d=3;

Sql_2 语句:select a from table_1 where b=1 and c=1;

Sql_3 语句:select a from table_1 group by c,d;

此时3个语句的关键字中此时可以依据顺序建立索引index(c,a,b),注意索引顺序,三个语句都可以走联合索引。

其他复杂子查询或连接查询也依次法分析。

(6)根据Sql优化方法和explain分析,调整索引(见目录三、六)

三、Sql优化方法

1、小表驱动大表

含有子查询的语句,in 用于子查询范围小于外查询,exist则反过来

2、union all 代替 union

减少过滤

3、Join代替子查询

减少回表

4、Where条件代替having

5、Select 字段值 代替 select *

四、左匹配原则

创建联合索引时,首先会对最左边字段排序,也就是第一个字段,然后再在保证第一个字段有序的情况下,再排序第二个字段,以此类推。

索引index(a,b,c);   

查询语句where b=1 and c =3【不走索引】

查询语句where a=1 and c =3【走部分索引,索引存在中断】

查询语句where b=1 and a=3【走部分索引,左匹配原则和索引列的顺序有关,和查询列的顺序无关,因sql有查询优化器,可以调整sql执行方法】

查询语句where b=1 and a=3 and c=9 【走索引】

五、索引失效

1、索引列存在函数运算或类型转换

>、<、between中断索引,只能匹配部分

2、like ‘%dkla0’        %出现在最左端会失效

3、Or两边有其中一边没有走索引l

4、不满足左匹配原则

六、EXPLAIN解释计划执行含义

1、Mysql中

关注type列:

system > const > eq_ref > ref > range > index > all

2、Oracle中

关注operation列:

index unique scan>index range scan>index skip scan>index fast full scan>index full scan>table access ful

mysql索引【type列】

oracle索引【operation列】

system

只有一条记录

index unique scan

主键扫描

const

主键+唯一【返回一行】

index range scan

索引范围扫描

eq ref

唯一索引

index skip scan

索引跳跃扫描

ref

联合索引

index fast full scan

索引快速扫描

range

主键或者索引,进行范围查询

index full scan

索引全扫

index

遍历索引树,索引全部数据

table access ful

全表查询

all

全表查询

索引跳跃扫描:不满足左前缀匹配原则时,sql优化器

索引快速扫描:无序

索引全扫:有序(order by索引)

七、索引操作语句

1、新增

alter table table_name ADD INDEX [index_name] (index_col_name,...)

2、删除

DROP INDEX index_name ON tbl_name;

八、效果

其他同业务查询的相关语句也缩减到3s以内

优化前:43秒

优化后:4秒

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

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

相关文章

Visual Studio Code 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开首选项设置对话框2. 在Font Family里面输入字体 前言 Visual Studio Code 自定义字体大小&#xff0c;统一设置为 Cascadia Code SemiBold &#xff0c;大小为 14 具体操作 【文件】>【首选项】>【设置】&…

18037 20秒后的时间

### 思路 1. 读取输入的时间&#xff0c;格式为小时:分钟:秒。 2. 将时间转换为秒数。 3. 增加20秒。 4. 将增加后的秒数转换回小时:分钟:秒格式。 5. 输出结果&#xff0c;确保小时、分钟和秒均占两个数字位&#xff0c;不足位用0补足。 ### 伪代码 1. 读取输入的时间字符串。…

day35-测试之性能测试JMeter的测试报告、并发数计算和性能监控

目录 一、JMeter的测试报告 1.1.聚合报告 1.2.html报告 二、JMeter的并发数计算 2.1.性能测试时的TPS&#xff0c;大都是根据用户真实的业务数据&#xff08;运营数据&#xff09;来计算的 2.2.运营数据 2.3.普通计算方法 2.4.二八原则计算方法 2.5.计算稳定性测试并发量 2.6…

vscode中如何设置不显示隐藏文件

在vscode中&#xff0c;有时候&#xff0c;会显示一些隐藏文件&#xff0c;如何设置让其不显示呢&#xff1f; 解决办法 例如&#xff1a;我这里有一个.vscode隐藏文件夹&#xff0c;是vscode默认生成的一个配置目录&#xff0c;我想要它不在资源管理器中进行显示。 操作步骤&a…

Java 入门指南:Java 并发编程 —— Condition 灵活管理线程间的同步

Condition Condition 是 Java 并发编程中的一种高级同步工具&#xff0c;它可以协助线程之间进行等待和通信。提供了一种比传统的 wait() 和 notify() 更加灵活的方式来管理线程间的同步。Condition 接口通常与 Lock 接口一起使用&#xff0c;允许更细粒度的控制线程的等待和唤…

Python 从入门到实战4(序列的操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中列表的简单操作&#xff0c;…

Android CCodec Codec2 (六)C2InterfaceHelper

通过前面几篇文章的学习&#xff0c;我们知道了Codec2参数结构&#xff0c;以及如何定义一个Codec2参数。接下来的几篇文章我们将简单了解上层是如何请求组件支持的参数、如何配置参数&#xff0c;以及参数是如何反射给上层的。本篇文章我们将了解接口参数实例化。 1、C2Interf…

SprinBoot+Vue社团管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

【最全深度学习介绍】基本概念、类型、应用、优缺点、与机器学习区别是什么?

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

excel规划求解结合vba宏笔记

目录 概念与配置 规划求解定义 excel设置规划求解 宏的基本操作 excel批量进行规划求解案例 加载规划求解模块 宏的设置 宏录制vba 其他案例 概念与配置 规划求解定义 运用“规划求解”定义并求解问题 - Microsoft 支持 excel设置规划求解 EXCEL规划求解的简明教程…

HarmonyOS鸿蒙开发:在线短视频流畅切换最佳实践

简介 为了帮助开发者解决在应用中在线短视频快速切换时容易出现快速切换播放时延过长的问题&#xff0c;将提供对应场景的解决方案。 该解决方案使用&#xff1a; 视频播放框架AVPlayer和滑块视图容器Swiper进行短视频滑动轮播切换。绘制组件XComponent的Surface类型动态渲染…

midwayjs 框架使用 rabbitmq 消息延迟

插件rabbitmq_delayed_message_exchange是RabbitMQ官方提供的一种用于实现延迟消息的解决方案。该插件将交换机类型扩展至x-delayed-message&#xff0c;这种类型的交换机能够将消息暂时挂起&#xff0c;直到设定的延迟时间到达&#xff0c;才将消息投递到绑定的队列中。这一特…

js做一个带模糊搜索、自动补全的select组件auto-input-select

效果图&#xff1a; 思路 原本是想弄一个输入框input&#xff0c;挡在原生select的前面&#xff0c;结果发现&#xff0c;原生select无论怎么弄&#xff0c;都无法js手动控制展开下拉选&#xff0c;必须点击select&#xff0c;这就很尴尬 然后就只能弄一个输入框input&#x…

python-变量声明、数据类型、标识符

一.变量 1.什么是变量 为什么需要变量呢&#xff1f; 一个程序就是一个世界&#xff0c;不论使用哪种高级程序语言编写代码&#xff0c;变量都是其程序的基本组成单位。如下图所示的sum和sub都是变量。 变量的定义&#xff1a; 变量相当于内存中一个数据存储空间的表示&#…

【Unity小工具】Image组件宽度、高度自适应

Unity开发中&#xff0c;用同一个Image进行动态加载不同尺寸的图片&#xff0c;在显示上会有形变此工具可以进行Image的宽度、高度自适应 实现原理 获取Image原始尺寸&#xff08;sizeDelta&#xff09;获取图片原始尺寸&#xff08;spriteSizeDelta&#xff09;公式&#xff…

Git 忽略已经提交的文件

对于未提交过的文件直接用ignore文件即可,不再赘述 对于已经提交过的文件,但是实际上不需要的,可以用git rm --cached命令 比如下图这个 .vsconfig被我误提交了或者忘了在ignore里添加了 但是我实际上不想要这个文件,那么在项目根目录打开git bash ,输入 git rm --cached .vsc…

【Hot100】LeetCode—34. 在排序数组中查找元素的第一个和最后一个位置

目录 1- 思路二分 - 左侧二分 右侧二分 2- 实现⭐34. 在排序数组中查找元素的第一个和最后一个位置——题解思路 3- ACM 实现 原题链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 1- 思路 二分 - 左侧二分 右侧二分 右区间二分 ——> 找首次出现的位置…

unreal engine5.4.3动画重定向

UE5系列文章目录 文章目录 UE5系列文章目录前言 前言 ue5.4和ue3动画重定向之间存在差异&#xff0c;跟ue5.2差别更大一点&#xff0c;总之ue5.4越来越简化动画重定向&#xff0c;不想之前还需要制作RTG文件 这是ue5.3.2的制作动画重定向的界面 这是ue5.4.2的制作动画重定向…

编译FFmpeg动态库

编译FFmpeg动态库 环境 macOS High SierraFFmpeg 4.3android-ndk-r21b 编译so库 下载FFmpeg4.3源代码&#xff0c;进入源码目录创建build_android.sh脚本&#xff0c;ffmpeg从4.0起新增了target-osandroid&#xff0c;所以不用再修改configure文件。 注意&#xff1a; ndk…

k8s1.23 部署Prometheus-Operator集群监控

1. Prometheus-Operator介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 相关监控组件的本地部署和管理方案&#xff0c;该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置&#xff0c;主要包括以下几个功能&#xff1a; kubernetes自定义资源&#…