论索引的重要性

news2024/9/25 17:17:22

开篇小测验

下面这样一个小SQL 你该怎么样添加最优索引

两个表上现在只有聚集索引

bigproduct 表上已经有聚集索引 ProductID

bigtransactionhistory 表上已经有聚集索引 TransactionID

你是否一眼就能看出来呢?

答案将在文章中逐步揭晓~~~

简单粗暴的添加索引

首先我们看一下没有优化前的执行计划

clustered index scan 这其实就是表扫描,不是table scan 只是因为表上有聚集索引

可以看出这个查询俩表都使用了表扫描!

where 条件添加索引

首先大多数人都知道 where 条件中的字段需要添加索引! 我们添加一下看看效果创建

在 bigproduct 表上创建 name 列索引,在bigtransactionhistory表上创建TransactionDate 列索引。

再次执行语句看一下效果!

添加where索引以后可以看到以下几个现象

  • bigproduct 从原来的clustered index scan 变成 index seek

  • 另外多出来个KEY Lookup(clustered)

  • bigproduct 上添加的索引起了作用,逻辑读bigproduct 由 601 变成10。

  • bigtransactionhistory 没啥变化啊还是clustered index scan

解释一下出现的现象 :首先一点bigproduct 边添加的where条件索引,起到了作用,执行的时候不是全表扫描了,逻辑读有明显的下降,出现的 KEY Lookup 是因为选择(select)的列,在索引中没有,而需要通过聚集索引再查找一次,再找一次也意味着多一部分开销!

那么同样添加了where 条件索引的bigtransactionhistory表为什么没起作用呢?那是因为SQL优化器在选择计划的时候认为,不使用TransactionDate 列索引查找效率会更好!

真的么?我们来验证一下,通过指定选择索引,来让优化器选择索引查找!

强制使用索引以后,可以看出逻辑读由 14W 变成1961W,语句时间也变得很长,这就是优化器为什么不选用你加的索引!优化器还是很智能的吧。

高能预警:优化器可不是什么时候都这么智能的...由于缓存计划或优化器抽风等原因,也会出现优化器用了这种索引,导致你的语句奇慢,读飙升直接影响到你的内存、磁盘、CPU资源!另外如果这样一条语句是系统中一条很频繁运行的语句,你的系统就挂了!没错就挂了!这就是开篇抛出的问题就是因为一条语句!

消灭Key Lookup 添加select 字段

这就是传说中的覆盖索引!

看到执行计划中存在Key Lookup 而且消耗占比很高,如上面强制索引的计划,那么我们就要想到的 在索引中包含那些SELECT 的列!如果消耗低,逻辑读少,如上面bigproduct 表中的Key Lookup 就可以忽略(如果你追求完美,也一样优化就可以了)。

包含列的图形化创建:@秋仙 特意给你的说明

语句创建就是:

下面我们添加一下看看效果:

添加select 索引字段后可以看出的现象:

  • 优化器自己选择了index seek

  • bigtransactionhistory占比最高的Key Lookup消失了

  • 逻辑读由原来无索引的14W变成1W

  • bigtransactionhistory表还提示缺少索引?

通过优化索引添加select 字段,我们看出语句又一次得到了提升bigtransactionhistory 从表扫描变成索引查找,逻辑读由14W变成 1W!这是一个质的飞跃啊!

CREATE NONCLUSTERED INDEXTransactionDate包含ProductID_QuantityON[dbo].[bigTransactionHistory] ([TransactionDate])------INCLUDE 就是包含列INCLUDE ([ProductID],[Quantity])GO

那为什么还提示缺少索引呢?创建一下试试吧!

索引再优化加入表关联列

按照提示我们创建索引:和上一个索引的不同 ProductID 列由包含列变成了索引列!

我们看一下效果:

再次优化索引以后可以看到以下几个现象

  • bigtransactionhistory表还是索引查找index seek

  • bigtransactionhistory依然没有了Key Lookup

  • 两表关联的hash join 变成了nested loops

  • 并行计划变成了串行

  • 逻辑读又从1W 变成18

又一次质的飞跃!读从原来的14W 变成1W 又变成18,这样大大减少了内存和IO的消耗,另外并行计划也变成了串行,无疑又减少了大量CPU的消耗!语句时间,我想这里就不用多说了吧?

高能预警:这里所说的hash join,并行变串行,不懂的朋友可以在百度自行学习,这里只是针对当前语句的情况,不能一概而论!

精简你的索引

大家都知道,索引会导致update、insert、delete操作变慢!那么尽量精简你的索引就是一个很重要的话题了!

上面的优化过程中我们创建了几个索引,以bigTransactionHistory为例来看一下:

脚本这里就不贴了,其实我们最后创建的索引 ProductID_TransactionDate包含Quantity 已经包含了前两个索引,而且可以说无论任何类似语句都使用ProductID_TransactionDate包含Quantity 就可以了!

那么我们就可以清除前两个索引!

至此语句的优化算是结束了,留下的就是bigproduct 依然有一个Key Lookup可以优化,可以仿照上面的继续优化,这里就不细说了。

这就是索引的重要性!

开篇小测试你做对了么?如果没做对那么这么请你自行模拟一个场景再现本篇的话题吧!

总结

数据库整体缓慢往往都是因为索引问题导致的,不要小看一条语句的威力,一条高频的语句足可以让你的数据库彻底无法工作。

在和大量的运维人员交流的过程中发现,对于索引的重要性恰恰没有足够的重视,一提到优化就是修改SQL语句、读写分离、分布式数据库等舍近求远的方案,优化索引才是对数据库最高性价比的优化。

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

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

相关文章

企业如何做好员工安全意识提升

背景: 近年来随着网络安全政策、技术的不断发展,国内企业对于安全的重视程度越来越高,安全建设投入力度越来越大,安全防御能力得到了明显的提升。然而,企业面临一个尴尬的问题就是,企业即使做了很多安全防…

Java还值得选择吗?

自1995年Java问世,到2023年已经差不多存在了28年。作为高级编程语言,他的生命周期相比很多编程语言都长,也见证了很多编程语言的辉煌时刻,不过Java始终都是名列前茅。 Java的主要优势在于其一次编写、随处运行。简单来讲&#xf…

185、【栈与队列】leetcode ——496. 下一个更大元素 I:单调栈-哈希表(C++版本)

题目描述 原题链接:496. 下一个更大元素 I 解题思路 本题与 739. 每日温度 的区别在于,需要先通过让nums1与nums2判定出为想等元素后,再去找nums2中更大的数。 因此,第一步需要找到想等数,第二步需要找到大于的数。…

快手电商新增商品信息诊断规则,对商家有何影响?

1、2022年快手短剧日活跃用户达2.6亿 新榜讯 近日,快手数据显示,2022年快手短剧日活跃用户达2.6亿,现在的付费用户数对比2022年4月增长超过480%,快手已经是最大的短剧消费市场。此外,2023年快手小游戏日活跃用户峰值超…

【Go】基于telegraf进行自定义插件开发(二)

基于telegraf进行自定义插件开发(二)前言正文设计开发过程单个服务的处理结构体同时定义了string和数值类型适配本机服务或者多个ip来源程序打包结语前言 书接上会,这次记录一下我基于telegraf进行的hdfs监控组件的开发工作,这其…

RabbitMQ实现延时队列

目录什么是延时队列延时队列的使用场景前提准备利用RabbitMQ实现延时队列延时队列优化利用RabbitMQ插件实现延迟队列什么是延时队列 延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的&#…

沃尔玛采购退款大额过不了的原因是什么?

市面上有很多伪装工具,但不是针对沃尔玛,很多软件方只是针对大众平台伪装,主要是方便程序开发人员调测系统程序,并不是能用于沃尔玛行业。而且每一个平台的风控是不—样的,我们技术团队从底层硬件环境开始配合软件控制…

【论文精读】MVSNet系列(2018-2022)总结

MVSNet系列总结1.MVSNet ECCV20182.RMVSNet CVPR20193.P-MVSNet ICCV20194.MVSCRF ICCV20195.PointMVSNet ICCV20192019年的这四篇文章各有特点,其中RMVSNet、PointMVSNet更是打开了可以继续沿着往下做的思路:6.cascade MVSNet CVPR20207.UCSNet CVPR202…

初识go变量,使用var和:=来声明变量,声明变量的三种方式

初识go变量,使用var和:来声明变量,声明变量的三种方式 Go语言的变量名由字母、数字、下划线组成,其中首个字符不能为数字。 tip:(Go语言中的变量的规范,也和其他高级语言相同) 声明变量的一般形式是使用 var 关键字: var 变量…

SpringCloud源码探析(二)-Nacos注册中心

1.概述 Nacos是Spring Cloud Alibaba中的核心组件之一,它提供了服务发现、服务配置和服务管理等功能,可以作为注册中心和配置中心使用。注册中心是微服务架构体系中的核心组件之一,Nacos比Eureka有着更强大的功能,它们都能提供服…

Java多线程系列-- ForkJoin框架,分治的艺术

前言 本篇是多线程系列中的一篇,我们在先前的一篇文章中回顾了线程池的主要知识 Java多线程基础–线程的创建与线程池管理 过去了很长时间,我们简单提要一下: 设计目的:简化线程的使用,管理与复用,避免…

Windows 远程桌面安全吗?电脑远程桌面的安全如何保障?

远程桌面会话在加密通道上运行,防止任何人通过监听网络来查看您的会话。 但是,在早期版本的 RDP 中用于加密会话的方法存在漏洞。 此漏洞可能允许使用中间人攻击 (link is external) 未经授权访问您的会话。 我们可以在 Windows 10、Windows 11 和 Wind…

学好数据结构与算法其实一点也不难

一. 初识算法 1.1 什么是算法? 定义 在数学和计算机科学领域,算法是一系列有限的严谨指令,通常用于解决一类特定问题或执行计算 In mathematics and computer science, an algorithm (/ˈlɡərɪəm/) is a finite sequence of rigorous …

MSVCP140.dll下载及安装教程,dll修复方法

MSVCP140.dll是Windows操作系统中的一个DLL文件,许多程序依赖于它来正常运行。如果您尝试运行某个程序时,发现缺少MSVCP140.dll文件,那么您需要下载并安装它才能解决问题。本文将介绍如何MSVCP140.dll下载和安装MSVCP140.dll。 第一步&#x…

解决树莓派 bullseye (11) 系统无法通过 xrdp 远程连接的问题

我手上有一台树莓派 4B,使用官方镜像烧录器烧录老版本操作系统 buster (10) 时可以正常通过 Windows 远程桌面连接上,但换成最新的 bullseye (11) 系统后却无法正常连接远程桌面。 问题复现: 使用官方镜像烧录器烧录,配置用户名为…

CSDN 竞赛 32 期

CSDN 竞赛 32 期1、题目名称:传奇霸业2、题目名称:严查枪火3、题目名称:蚂蚁家族4、题目名称:运输石油小结1、题目名称:传奇霸业 传奇霸业,是兄弟就来干。 小春(HP a)遇到了一只黄金哥布林(HP x)。 小春每…

20个让你效率更高的CSS代码技巧

在本文中,我们想与您分享一个由各大css网站总结推荐的20个有用的规则和实践经验集合。有一些是面向CSS初学者的,有一些知识点是进阶型的。希望每个人通过这篇文章都能学到对自己有用的知识。好了,我们开始。1.注意外边距折叠与其他大多数属性…

从工地转行软件测试,拿下13k+年终奖是种什么体验?

最近,一则名为《我:毕业五年,存款5000。她:中传硕士,火锅店保洁》的视频走红网络,两位名校毕业生看似高开低走的就业经历,引起了很多人的共鸣。她们所传达的并不是所谓的躺平、摆烂,而是希望更多…

spark性能调优(一):Shuffle

Shuffle 一、配置项调优二、减少shuffle数据量三、避免shuffle何为shuffle? 集群中跨进程、跨节点的数据分发(Map的输出文件写到本地磁盘,Reducer把Map的输出文件拉到本地)为什么要shuffle? 准确的说,shuffle是刚需(业务场景决定的),分布式环境中,不同节点不能进行内存交换,只…

加快发展先进制造业势在必行!

众所周知,我国是制造大国,但并非制造强国。而我们在持续发展制造业的进程中也面临着诸多实际问题,如产业发展后续乏力,环境制约异常突出,技术创新能力薄弱,结构调整任务艰巨等等。故而要实现由制造大国向制…