SQL优化-索引(1)

ch32v103xx 烧写 烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。 阅读详情
(一)深入浅出理解索引结构

  实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:

  其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。

  我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。

  如果您认识某个字,您可以快速地从自典中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

  我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

  通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。

  进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。

  (二)何时使用聚集索引或非聚集索引

  下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

 动作描述使用聚集索引  使用非聚集索引
 外键列 应  应
 主键列 应 应
 列经常被分组排序(order by) 应 应
 返回某范围内的数据 应 不应
 小数目的不同值 应 不应
 大数目的不同值 不应 应
 频繁更新的列不应  应
 频繁修改索引列 不应 应
 一个或极少不同值 不应 不应

   事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

(三)结合实际,谈索引使用的误区

  理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。

  1、主键就是聚集索引

  这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQL SERVER默认是在主键上建立聚集索引的。

  通常,我们会在每个表中都建立一个ID列,以区分每条数据,并且这个ID列是自动增大的,步长一般为1。我们的这个办公自动化的实例中的列Gid就是如此。此时,如果我们将这个列设为主键,SQL SERVER会将此列默认为聚集索引。这样做有好处,就是可以让您的数据在数据库中按照ID进行物理排序,但笔者认为这样做意义不大。

  显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。

  从我们前面谈到的聚集索引的定义我们可以看出,使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。在实际应用中,因为ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。这就使让ID号这个主键作为聚集索引成为一种资源浪费。其次,让每个ID号都不同的字段作为聚集索引也不符合“大数目的不同值情况下不应建立聚合索引”规则;当然,这种情况只是针对用户经常修改记录内容,特别是索引项的时候会负作用,但对于查询速度并没有影响。

  在办公自动化系统中,无论是系统首页显示的需要用户签收的文件、会议还是用户进行文件查询等任何情况下进行数据查询都离不开字段的是“日期”还有用户本身的“用户名”。

  通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果您的系统已建立了很长时间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。如果您的办公自动化系统已经建立的2年,那么您的首页显示速度理论上将是原来速度8倍,甚至更快。

  在这里之所以提到“理论上”三字,是因为如果您的聚集索引还是盲目地建在ID这个主键上时,您的查询速度是没有这么高的,即使您在“日期”这个字段上建立的索引(非聚合索引)。下面我们就来看一下在1000万条数据量的情况下各种查询的速度表现(3个月内的数据为25万条):

  (1)仅在主键上建立聚集索引,并且不划分时间段:

  Select gid,fariqi,neibuyonghu,title from tgongwen

  用时:128470毫秒(即:128秒)

  (2)在主键上建立聚集索引,在fariq上建立非聚集索引:

  select gid,fariqi,neibuyonghu,title from Tgongwen

  where fariqi> dateadd(day,-90,getdate())

  用时:53763毫秒(54秒)

  (3)将聚合索引建立在日期列(fariqi)上:

  select gid,fariqi,neibuyonghu,title from Tgongwen

  where fariqi> dateadd(day,-90,getdate())

  用时:2423毫秒(2秒)

  虽然每条语句提取出来的都是25万条数据,各种情况的差异却是巨大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有1000万容量的话,把主键建立在ID列上,就像以上的第1、2种情况,在网页上的表现就是超时,根本就无法显示。这也是我摒弃ID列作为聚集索引的一个最重要的因素。

  得出以上速度的方法是:在各个select语句前加:

  declare @d datetime

  set @d=getdate()

  并在select语句后加:

  select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())

 2、只要建立索引就能显著提高查询速度

  事实上,我们可以发现上面的例子中,第2、3条语句完全相同,且建立索引的字段也相同;不同的仅是前者在fariqi字段上建立的是非聚合索引,后者在此字段上建立的是聚合索引,但查询速度却有着天壤之别。所以,并非是在任何字段上简单地建立索引就能提高查询速度。

  从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。

  3、把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度

  上面已经谈到:在进行数据查询时都离不开字段的是“日期”还有用户本身的“用户名”。既然这两个字段都是如此的重要,我们可以把他们合并起来,建立一个复合索引(compound index)。

  很多人认为只要把任何字段加进聚集索引,就能提高查询速度,也有人感到迷惑:如果把复合的聚集索引字段分开查询,那么查询速度会减慢吗?带着这个问题,我们来看一下以下的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列,用户名neibuyonghu排在后列)

  (1)select gid,fariqi,neibuyonghu,title from Tgongwen

  where fariqi>'2004-5-5'

  查询速度:2513毫秒

  (2)select gid,fariqi,neibuyonghu,title from Tgongwen

  where fariqi>'2004-5-5' and neibuyonghu='办公室'

  查询速度:2516毫秒

  (3)select gid,fariqi,neibuyonghu,title from Tgongwen

  where neibuyonghu='办公室'

  查询速度:60280毫秒

  从以上试验中,我们可以看到如果仅用聚集索引的起始列作为查询条件和同时用到复合聚集索引的全部列的查询速度是几乎一样的,甚至比用上全部的复合索引列还要略快(在查询结果集数目一样的情况下);而如果仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起任何作用的。当然,语句1、2的查询速度一样是因为查询的条目数一样,如果复合索引的所有列都用上,而且查询结果少的话,这样就会形成“索引覆盖”,因而性能可以达到最优。同时,请记住:无论您是否经常使用聚合索引的其他列,但其前导列一定要是使用最频繁的列。

(四)其他书上没有的索引使用经验总结

  1、用聚合索引比用不是聚合索引的主键速度快

  下面是实例语句:(都是提取25万条数据)

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen

  where fariqi='2004-9-16'

  使用时间:3326毫秒

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen where gid<=250000

  使用时间:4470毫秒

  这里,用聚合索引比用不是聚合索引的主键速度快了近1/4。

  2、用聚合索引比用一般的主键作order by时速度快,特别是在小数据量情况下

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by fariqi

  用时:12936

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

  用时:18843

  这里,用聚合索引比用一般的主键作order by时,速度快了3/10。事实上,如果数据量很小的话,用聚集索引作为排序列要比使用非聚集索引速度快得明显的多;而数据量如果很大的话,如10万以上,则二者的速度差别不明显。

  3、使用聚合索引内的时间段,搜索时间会按数据占整个数据表的百分比成比例减少,而无论聚合索引使用了多少个

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen

  where fariqi>'2004-1-1'

  用时:6343毫秒(提取100万条)

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen

  where fariqi>'2004-6-6'

  用时:3170毫秒(提取50万条)

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen

  where fariqi='2004-9-16'

  用时:3326毫秒(和上句的结果一模一样。如果采集的数量一样,那么用大于号和等于号是一样的)

  select gid,fariqi,neibuyonghu,reader,title from Tgongwen

  where fariqi>'2004-1-1' and fariqi<'2004-6-6'

  用时:3280毫秒

 

TPAMI 2024 | MO-MIX:基于深度强化学习的多目标多智能体协同决策 深度强化学习(RL)已被广泛应用于解决复杂的决策问题。在许多现实世界的场景中,任务通常有多个相互冲突的目标,并且可能需要多个智能体进行合作,这些是多目标多智能体决策问题。然而,在这个交叉领域的研究工作还相对较少。现有的方法仅限于单独的领域,并且只能处理具有单一目标的多智能体决策,或者具有单一智能体的多目标决策。在本文中,我们提出了MO-MIX来解决多目标多智能体强化学习(MOMARL)问题。我们的方法基于集中训练与分散执行(CTDE)框架。 阅读详情

相关推荐

使用TMS320F28335控制四位共阳数码管

简要阐述利用F28335控制四位共阳数码管的整个过程,包括原理、思路、部分代码以及调试过程。

liujunhaozuishuai的博客 2656

SQL 优化实战总结:索引、深分页、JOIN、N+1 一次讲清

本文结合实际项目中接触过的 SQL 优化场景,对常见的性能问题做了一次梳理,主要包括执行计划分析、索引设计、索引区分度、深分页、JOIN、N+1 查询以及批量操作等内容。文章重点不在于总结固定的“优化口诀”,而是从扫描数据量、SQL 执行次数和实际耗时几个角度出发,理解 SQL 性能问题应该如何定位和分析,并结合具体场景选择更合适的优化方式。

2301_79472735的博客 524

利用Cesium引擎实现大疆智图B3DM三维模型的高效加载与可视化

本文详细介绍了如何利用Cesium引擎高效加载与可视化大疆智图B3DM三维模型。通过性能优化实战和典型应用场景分析,帮助开发者掌握模型预处理、渲染参数调优及高级功能实现技巧,提升大规模倾斜摄影数据的网页端展示效率。

weixin_29231725的博客 218

oracle sql优化案例1(使用组合索引)

Bad sql SELECT T3.CONFLICT_ID,        T3.LAST_UPD,        T3.CREATED,        T3.LAST_UPD_BY,        T3.CREATED_BY,        T3.MODIFICATION_NUM,        T3.ROW_ID,        T3.ATTR_04,        T3.A

hijk139的专栏 2294

Qt/C++ 音视频开发 - FFmpeg 安卓版

通过将 FFmpeg 集成到 Qt/C++ 项目中,我们可以实现强大且灵活的音视频处理功能。本文介绍了在安卓平台上使用 FFmpeg 的基本步骤,包括初始化、解码、处理和编码等。实际应用代码示例展示了如何在安卓设备上播放视频。

走向CTO的路上... 1190

广东省道路工程检测练习试题(单选题)真题

1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( )

ZShy001238的博客 681

oracle rebuiled索引,sql语句优化总结[1]

sql语句优化总结[1] (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!14.90 积分数据库优化总结一、 前言 1二、 在SELECT子句中避免使用‘*’ 1三、 删除重复记录 1四、 计算记录条数 2五、 减少对表的查询 2六、 EXISTS 与IN使用 2七、 使用索引 3八、 UNION与UNION ALL的使用 4九、 驱动表的选择 5...

weixin_29055699的博客 194

【论文精读】Graph WaveNet-深度时空图模型

Graph WaveNet构建了一个自适应邻接矩阵,它能保留隐藏的空间依赖关系,能够自动从数据中发现未见的图结构。提出了一个有效且高效的框架,可同时捕捉空间和时间依赖关系。其核心思想是将其提出的图卷积与扩张因果卷积相结合,使每个图卷积层都能处理空间依赖关系。在交通数据集上评估了提出的模型,并以较低的计算成本获得了最先进的结果。

打酱油的葫芦娃 1007

从3秒到1毫秒:SQL索引优化实战全流程

做后端开发和数据运维这么多年,我见过太多团队踩过SQL性能的坑:业务量刚破十万,数据库CPU直接冲到99%,接口超时告警刷满整个运维群,排查半天最后发现只是一条没加索引的关联查询拖垮了整个服务。很多人总觉得“SQL慢了就加索引”,但实际线上场景里,盲目加索引不仅解决不了问题,还可能引发写入性能下降、索引冗余等新问题。今天我就结合自己在电商订单系统里踩过的真实案例,把从定位问题到落地优化的完整流程拆解清楚,哪怕是刚接触数据库的新人,也能照着步骤把慢查询彻底优化到位。

Start_mswin的博客 505

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3089

图机器学习(1)——图论基础

图 (Graph) 是一种描述实体间关系的数学结构,几乎在各个领域都有应用。例如,社交网络就是图,其中用户之间的连接取决于一个用户是否“关注”另一个用户。图论,即对图的研究,一直以来广受关注,包含了大量算法、性质分析方法和数学模型,以解析复杂系统的行为特征。本节将介绍图数据结构的核心概念,通过理论阐述与实例演示相结合的方式,理解基础理论用以实践应用。重点介绍用于创建、操作和研究复杂网络结构与功能的 Python 库。

盼小辉丶的博客 9027

程序员面试优化场景必问:如何利用索引优化SQL语句?如何从0到1设计一套性能优良的索引系统?

程序员面试优化场景必问:如何利用索引优化SQL语句?如何从0到1设计一套性能优良的索引系统?

马士兵教育 525

基于SSD2828和STM32的MIPI显示屏驱动系统设计与实现

在硬件层面,需要将STM32、SSD2828和MIPI显示屏连接起来。STM32与SSD2828的连接:通过SPI接口连接STM32和SSD2828,用于配置和控制SSD2828。SSD2828与MIPI显示屏的连接:通过MIPI DSI接口连接SSD2828和MIPI显示屏,用于传输显示数据。

qq_38334677的博客 7143

十分钟弄懂SQL 索引及优化(1)

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />

erghtt的博客 921

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

EXPLAIN sql优化方法(1) 添加索引

explain/desc显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 -- 实际SQL,查找用户名为Jefabc的员工 select * from emp where name = 'Jefabc'; -- 查看SQL是否使用索引,前面加上explain即可 explain select * from emp where nam...

hudeyong926的专栏 880

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SQL优化-索引 1

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)……   (一)深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引...

weixin_34023982的博客 90

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SQL优化-索引优化1

微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)……  (一)深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clusteredindex,也称聚类索引、簇集索引)和非聚集索引(non

259

SQL Server优化(1)-索引

(一)深入浅出理解索引结构   实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:   其实,我们的汉语字典的正文本身就是一个聚集索引。比如...

dongemen5245的博客 131

SQL索引优化1(索引的概念及技巧)

此系列博客整理自微信公众号-架构师之路。感谢沈神的无私分享。 一、索引的概念及技巧举例,业务场景,用户表,表结构为: t_user( uid primary key, login_name unique, passwd, login_time, age, … ); 1.聚合索引聚集索引(clustered index):聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引,一般用primar

爱吃韭菜的程序员 565

个人总结1.2w字解析MySQL索引和SQL优化

本文讲解了MySQL 索引与 SQL 优化,详解 B + 树原理、索引分类与语法,通过慢查询日志、explain等分析性能,拆解索引生效规则,提供插入、排序、分页等场景优化方案,解决数据库性能瓶颈。

无籽西瓜a的博客 1万+

EXPLAIN sql优化方法1 添加索引

先limit再join SELECT a.prj_id,a.pre_doc_id,a.out_time, a.inactive_user, a.inactive_time,  u.use_nm, GROUP_CONCAT(Distinct d.job_no) jb_nos,ifnull(sum(b.qty),0) pre_qty,  ifnull(sum(c.qty),0) qty, G

MayMatrix 的博客 516
上一篇: JOIN联表中ON,WHERE后面跟条件的区别
下一篇: 随便看看
BEIDOUJS
博客等级 码龄16年 98粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值