openGauss 之索引回表

2024-09-07 23:52
文章标签 索引 opengauss 回表

本文主要是介绍openGauss 之索引回表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 前言

​       在openGauss中如果表有索引信息,查询的谓词条件中又包含索引列,openGauss支持通过索引信息快速拿到需要访问元组的位置信息,然后直接到该位置上取出元组数据,称之为回表查询。如下所示,利用索引索引列id=55快速找到t111上对应元组的位置信息,然后通过位置信息拿到id为55的元组中所有列的数据。

    本文通过走读openGauss的代码了解openGauss是怎样实现回表查询的。

二.  Insert处理

​       要想实现能快速回表,那么insert时需要保存索引和物理表的位置信息关系。openGauss的insert的入口在ExecInsertT中,保存索引列与元组的位置信息代码流程如下所示:

ExecInsertTpTSelf = tableam_tops_get_t_self(result_relation_desc, tuple) // pTSelf保存着的是索引对应物理表元组位置信息relation->rd_tam_ops->tops_get_t_self(tup);HeapamTopsGetTSelfreturn tup->t_self   // 元组的物理表位置信息,即元组的t_selfExecInsertIndexTuplesindex_insert(..values, tupleid...)  // value为索引值,tupleid为对应物理表中元组位置信息btinsert_internal_bt_doinsert_bt_insertonpg_bt_pgaddtup(...itup...)  // 保存索引和其物理表中元组位置信息,itup为索引对应物理表元组位置信息

三.  回表查询

​       回表查询是在访问索引时,能通过索引的条件拿到元组的tid信息,然后到对应的物理表的tid位置上直接读取元组信息,代码入口在IndexNext,代码流程如下所示:

IndexNextscan_handler_idx_getnextindex_getnexttid = index_getnext_tid(scan, direction);  // 此函数将会拿到索引对应的物理表的元组地址DatumGetBool(FunctionCall2(procedure, PointerGetDatum(scan), Int32GetDatum(direction)));btgettuple_bt_gettuple_internalif (!BTScanPosIsValid(so->currPos))res = _bt_first(scan, dir);   // 首次扫描会将根据谓词条件二分法查找索引,并且保持满足谓词条件的起始地址和条数elseres = _bt_next(scan, dir);  // 初始化过之后,只要没有超过条数,直接返回下一条即可currItem = &so->currPos.items[so->currPos.itemIndex];scan->xs_ctup.t_self = currItem->heapTid;    // 回表元组的地址信息   IndexFetchTuple(scan)   // scan中保存有需要扫描元组的位置信息tidtableam_scan_index_fetch_tupleHeapamScanIndexFetchTupleheapam_index_fetch_tupleItemPointer tid = &scan->xs_ctup.t_self     // 对应上边索引返回的元组的地址信息heap_hot_search_buffer    // 拿到包含所有列完整的元组数据

这篇关于openGauss 之索引回表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146528

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

贝壳面试:什么是回表?什么是索引下推?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL 索引下推 的认识? 2.在MySQL中,索引下推 是如何实现的?请简述其工作原理。 3、说说什么是 回表,什么是 索引下推 ? 最近有小伙伴在面试 贝壳、soul,又遇到了相关的

Mysql高级篇(中)——索引介绍

Mysql高级篇(中)——索引介绍 一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3) 按存储引擎分类(4) 按存储方式分类(5) 按使用方式分类 四、 索引基本语法(1)创建索引(2)查看索引(3)删除索引(4)ALTER 关键字创建/删除索引 五、适合创建索引的情况思考题 六、不适合创建索引的情况 一、索引本质 索引本质 是 一种数据结构,它用

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询; 一、首先启动相关服务: 二、新建一个film索引: 三、建立映射: 1、通过Head插件: POST http://192.168.1.111:9200/film/_mapping/dongzuo/ {"properties": {"title": {"type":

ElasticSearch 6.1.1运用代码添加索引及其添加,修改,删除文档

1、新建一个MAVEN项目:ElasticSearchTest 2、修改pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

数据库系统 第42节 数据库索引简介

数据库索引是数据库表中一个或多个列的数据结构,用于加快数据检索速度。除了基础的B-Tree索引,其他类型的索引针对特定的数据类型和查询模式提供了优化。以下是几种不同类型的索引及其使用场景的详细说明和示例代码。 1. 位图索引 (Bitmap Index) 位图索引适用于具有少量不同值的列(例如性别、国家代码等),它使用位图来表示数据,从而提高查询效率。 适用场景:当列中的值域较小,且数据分布

PostgreSQL索引介绍

梦中彩虹   博客园首页新随笔联系管理 随笔 - 131  文章 - 1  评论 - 14 PostgreSQL索引介绍 INDEX 索引是增强数据库性能的常用方法。索引使得数据库在查找和检索数据库的特定行的时候比没有索引快的多。但索引也增加了整个数据库系统的开销,所以应该合理使用。 介绍 假设我们有一个类似这样的表: CREATE TABLE test1 (id integ

【VueJS】v-for的索引获取

在Vue1.x版本中 在 v-for 块内我们能完全访问父组件作用域内的属性,另有一个特殊变量 $index,正如你猜到的,它是当前数组元素的索引: <div id="app"><ul v-for="tab in tabs"><li>{{$index}} {{tab.name}}</li></ul></div><script>var app = new Vue({el: "#app",dat

C#索引器(Indexer)

索引器(Indexer)允许一个对象可以像数组一样使用下标的方式来访问. 当为类定义一个索引器时,该类的行为就会像一个虚拟数组(virtual array) 一样.可以使用数组访问运算符[]来访问该类的成员. 语法 一维索引器的语法如下: element-type this[int index] {    // get 访问器    get    {       // 返回 index 指