闲谈索引、谓词和DB2运行架构

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

12月1日,IBM数据库解决方案架构师马远老师,在DBA+社群DB2用户群进行了一次主题为“闲谈索引、谓词和DB2运行架构”的线上分享。小编特别整理出其中精华内容,供大家学习交流。同时,也非常感谢马远老师对DBA+社群给予的大力支持。



嘉宾简介:马远
 
 

  • 数据库解决方案架构师

  • 就职于IBM中国实验室,支持中国区的DB2主要合作伙伴,同时具有多年主机DB2(DB2 for z/OS)和DB2工具的研发经验


演讲实录
 

DB2索引的节点都是页(page),由一个根节点,若干中间节点(非叶子节点),还有叶子节点构成。


我们先回顾一下DB2所用索引的数据结构--B+数,B+树和B树有一项主要区别是B+树的最底层叶子节点是通过指针连在一起的。


我们来看一个两个键值(key)的索引的叶子节点示例,索引都是按照键值排序的,键值后面挂上RID。


通常我们用三角形来简化索引,三角形的底边就是有序的键值外挂上RID。


这是一个静态的谓词分析,我们不用考虑将这个谓词放在SQL中,也不用考虑是不是有索引可以使用,仅仅是谓词的一个属性。


这里解释一下Indexable,可索引加速,这个谓词如果使用对应的索引,可以在索引上确定一段连续的范围。


Sargable(Search ARGument ABLE),这词很晦涩,只在RDBMS里才用,衡量的标准很简单,对比与Indexable,Sargable的谓词无法确定索引上的一段连续范围。也许是两段,也许是多段。


这就是DB2的运行架构(runtime)。一般大家会比较熟悉存放数据页的缓冲池(Bufferpool)。以一条查询(Query)的运行为例,DB2从表和索引的读取到返回给用户结果集,会从下到上走过BM,IM,DM,RDS这些模块。


我们今天讨论话题的重点是红框中的IM和DM。


从上往下看,最高级的,功能最强的RDS模块,希望下面的DM和IM能帮它尽量多的承担机械化的工作,比如SELECT * FROM T1 WHERE C1 = 5,RDS会把'C1','=','5'扔给DM(1)。由DM把满足条件的每一条记录返回给RDS(4)。如果执行计划中使用了索引,DM还会去调用IM。


再往下看,DM和IM会根据表扫描还是索引扫描的需求(2),让BM提供表的数据页(Table Page)和索引页(Index Page)(3)。BM负责管理缓冲区。


对于数据管理器DM,我们已经知道它是在表扫描的时候工作。但是对于索引管理器,通过什么策略去拿索引页,如何应用谓词?通常情况下,索引会有两种扫描方式,一种是匹配扫描,另一种是筛选扫描。


匹配扫描对应的是索引上一段连续的范围,扫描从根节点开始遍历,找到叶子节点上满足条件的键值,一直到结束的条件,都是我们需要的,直接返回就可以了。


筛选扫描对应不了一段连续的范围,可能是两端或者多段,所以扫描叶子节点之后,不能无脑返回结果,我们还需要在每条索引的键值上应用谓词。


如果我们使用的索引有多个键值,谓词也是多个布尔条件,那么匹配和筛选就可以结合起来使用,我们来看一个例子。


大家注意,拿到一个SQL之后,我们就可以对其中的谓词进行静态分析,像上图中的Indexable和Sargable谓词。和有无索引,是否有统计信息,优化器如何选择执行计划都没有关系。


如果我们建立了索引,并且使用了索引之后,才有所谓的Matching和Screening。


假设使用了索引1,C1,C2上的谓词组合起来可以确定索引上一段连续的范围,所以C1,C2都匹配上了。我们选出一段较窄的范围,再拿C3进行筛选。


假设使用了索引2,因为C2,C1的键值排列顺序,无法通过C2,C1的组合谓词确定一段连续范围。只能有C2匹配上,可以看出需要扫描较大的一段开口范围,然后再通过C1,C3进行筛选。


显而易见,使用索引1的效率要高。


对于布尔条件组合的谓词(AND连接起来的谓词) ,匹配扫描会从索引的第一个键开始,停在第一个非等于的Indexable谓词。


举例:C1 = 1 & C2 = 'B' & C3 > 10 & C 4 = 2, IX(C2,C1,C3,C4),那么C2,C1,C3是匹配,C4是筛选。


我们刚才没提到的剩余的(Residual)谓词,所谓剩余是指DM和IM都无法处理,只能在RDS中处理,这意味着我们需要DM提供更多的记录,相应的,我们也需要读取更多的数据页,所以效率肯定不好。


最好的谓词肯定是Indexable,只有是Indexable的谓词才可能做匹配扫描。但是如果没有对应的索引,或者优化器没有选择对应的索引,Indexable和Sargable的谓词都可以做索引的筛选扫描,或者在DM中进行表扫描。


总结:


  1. 尽量写Indexable的谓词

  2. 尽量写“=”的操作符

  3. 索引的前几个键值尽量包含“=”谓词所在的列


Q & A
 
 

Q1:联合索引的话,DB2会跳过索引的第一个字段而直接使用后面的吗?


A:如果是匹配扫描的话,是不行的。但是筛选扫描可以,因为筛选只是把在键值上进行筛选,避免了表扫描去访问更多的Table Page。




Q2:谓词使用有没有先后顺序?例如:是不是能过滤大数据量的放前面?


A:谓词的使用是有先后顺序的,但是顺序不是这样,一般会先用local predicate,本地的,只涉及本表的,然后才是subquery,join等等。如果都是local predicate,只会有我刚才讲的Matching先进行完再筛选这个顺序。如果是在DM里做的,都是表扫描的话,我们可以认为所有谓词是同时做的。




Q3:那些所谓的“不好的谓词”有什么改造的方法?在不变更表结构的前提下。


A:这个要具体分析,但是可以抛砖引玉。我举个例子,Year(DateCol) = 2005。这是个加了function的谓词,只能在RDS中才能应用。但是我们也可以通过DateCol Between 2005-1-1 and 2005-12-31.这样的改写,写成一个indexable的谓词。




Q4:如果是只有索引1,且查询条条件是 c2=50 and c3 like '%PAM%' 那么这个语句还走索引1吗?


A:这就要看优化器了,如果走的话都会是筛选。




Q5:索引压缩和列存储DB2支持吗?


A:压缩是支持的,列存储也支持,DB2 BLU是一个大功能。


本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-12-03

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
运维 Linux Apache
LAMP架构调优(二)——修改Apache运行用户
LAMP架构调优(二)——修改Apache运行用户
247 1
|
2月前
|
存储 分布式计算 大数据
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
大数据-169 Elasticsearch 索引使用 与 架构概念 增删改查
65 3
|
2月前
|
前端开发 Java 应用服务中间件
21张图解析Tomcat运行原理与架构全貌
【10月更文挑战第2天】本文通过21张图详细解析了Tomcat的运行原理与架构。Tomcat作为Java Web开发中最流行的Web服务器之一,其架构设计精妙。文章首先介绍了Tomcat的基本组件:Connector(连接器)负责网络通信,Container(容器)处理业务逻辑。连接器内部包括EndPoint、Processor和Adapter等组件,分别处理通信、协议解析和请求封装。容器采用多级结构(Engine、Host、Context、Wrapper),并通过Mapper组件进行请求路由。文章还探讨了Tomcat的生命周期管理、启动与停止机制,并通过源码分析展示了请求处理流程。
|
2月前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
68 3
|
2月前
|
消息中间件 监控 Java
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
78 1
|
5月前
|
NoSQL Redis 开发工具
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
Redis性能优化问题之检查 Redis 实例是否启用了透明大页机制,如何解决
|
5月前
|
消息中间件 API 数据库
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
在微服务架构中,每个服务通常都是一个独立运行、独立部署、独立扩展的组件,它们之间通过轻量级的通信机制(如HTTP/RESTful API、gRPC等)进行通信。
|
6月前
|
存储 关系型数据库 MySQL
架构面试题汇总:mysql索引汇总(2024版)
架构面试题汇总:mysql索引汇总(2024版)
|
6月前
|
存储 算法 C语言
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
【链表专题】深入探索链表:文章索引与知识架构(链表的概念、实现、应用、经典例题大合集)
|
7月前
|
机器学习/深度学习 存储 算法
【GPU】深入理解GPU硬件架构及运行机制
【GPU】深入理解GPU硬件架构及运行机制
914 0