首页 > 其他分享 >OceanBase里面的rowkey是什么概念,是由哪些要素构成的?

OceanBase里面的rowkey是什么概念,是由哪些要素构成的?

时间:2023-06-19 10:04:23浏览次数:39  
标签:index const 哪些 OceanBase column int64 obj rowkey return


Rowkey是OceanBase诞生之初就引入的概念,最终被确立是在OceanBase 0.3。

为了便于理解,不妨把OceanBase想象成一个Key-Value系统,Rowkey就是Key,Value就是返回的行数据。

如果你对mysql数据库熟悉,那么不妨把Rowkey理解成primary key,它就是那几个主键列的组合,列的顺序与primary key中定义的顺序一致。


OceanBase中的静态数据是按照rowkey顺序存储在磁盘中的,这样做的好处是:

1. 支持每一行的快速定位(想象一下BTree的查找过程,如果数据无序,根本无从查起,也不叫BTree了)

2. 支持连续行的扫描。一个rowkey对应一行,一个rowkey前缀则对应一片连续行。


在OceanBase 0.3之前的Rowkey是一个概念,在代码中并没有一个实体对象。例如,在0.2版本中,内存中的行数据是存储在一个大的二维数组中(实际是用一维数组存储,不过逻辑上是二维,对象叫ObCellArray),纵向维度就是一行行的数据,横向维度就是一列列的数据。每一行的开头几列都是Rowkey列,后面几列就是用户看到的数据列。

0.3之后引入了ObRowkey对象,用于表示一行的rowkey,它的构成要素包括:

1. 它记录了主键列的列数

2. 它以数组的形式记录了主键列的值,值在数组中的顺序与primary key的定义顺序一致。

这里是缩略版的ObRowkey定义:

class ObRowkey
    {
      public:
        ObRowkey() : obj_ptr_(NULL), obj_cnt_(0) {}
        ObRowkey(ObObj* ptr, const int64_t cnt) : obj_ptr_(ptr), obj_cnt_(cnt) {}
        ~ObRowkey() {}
        inline int64_t get_obj_cnt() const { return obj_cnt_; }
        inline const ObObj* get_obj_ptr() const { return obj_ptr_; }
        // for convenience compactible with ObString
        inline int64_t length()  const { return obj_cnt_; }
        inline const ObObj* ptr() const { return obj_ptr_; }
        int64_t get_binary_key_length() const ;
        inline bool is_empty_row() const { return NULL == obj_ptr_ && 0 == obj_cnt_; }
        // is min rowkey or max rowkey
        inline bool is_min_row(void) const { return (*this == ObRowkey::MIN_ROWKEY); }
        inline bool is_max_row(void) const { return (*this == ObRowkey::MAX_ROWKEY); }
        inline void set_min_row(void) { *this = ObRowkey::MIN_ROWKEY; }
        inline void set_max_row(void) { *this = ObRowkey::MAX_ROWKEY; }
      private:
        ObObj* obj_ptr_;
        int64_t obj_cnt_;
      public:
        static ObObj MIN_OBJECT;
        static ObObj MAX_OBJECT;
        static ObRowkey MIN_ROWKEY;
        static ObRowkey MAX_ROWKEY;
    };




但它不负责记录:

1. 每个主键列在表中是第几列

2. 每个主键列的数据类型是什么

如果要知道这些信息,需要借助ObRowkeyInfo结构:

class ObRowkeyInfo
    {

    public:
      ObRowkeyInfo();
      ~ObRowkeyInfo();

      inline int64_t get_size() const
      {
        return size_;
      }

      /**
       * get sum of every column's length.
       */
      int64_t get_binary_rowkey_length() const;

      /**
       * Get rowkey column by index
       * @param[in]  index   column index in RowkeyInfo
       * @param[out] column
       *
       * @return int  return OB_SUCCESS if get the column, otherwist return OB_ERROR
       */
      int get_column(const int64_t index, ObRowkeyColumn& column) const;
      const ObRowkeyColumn *get_column(const int64_t index) const;

      /**
       * Get rowkey column id by index
       * @param[in]  index   column index in RowkeyInfo
       * @param[out] column_id in ObRowkeyInfo
       *
       * @return int  return OB_SUCCESS if get the column, otherwist return OB_ERROR
       */
      int get_column_id(const int64_t index, uint64_t & column_id) const;

      /**
       * Add column to rowkey info
       * @param column column to add
       * @return itn  return OB_SUCCESS if add success, otherwise return OB_ERROR
       */
      int add_column(const ObRowkeyColumn& column);

      int get_index(const uint64_t column_id, int64_t &index, ObRowkeyColumn& column) const;
      int get_index(const uint64_t column_id, int64_t &index) const;
      bool is_rowkey_column(const uint64_t column_id) const;
      int set_column(int64_t idx, const ObRowkeyColumn& column);

      int64_t to_string(char* buf, const int64_t buf_len) const;
      NEED_SERIALIZE_AND_DESERIALIZE;
    private:
      ObRowkeyColumn columns_[OB_MAX_ROWKEY_COLUMN_NUMBER];
      int64_t size_;
    };





标签:index,const,哪些,OceanBase,column,int64,obj,rowkey,return
From: https://blog.51cto.com/maray/6510887

相关文章

  • Oceanbase中Rowkey String的几种使用模式
    1.Rowkey深拷贝 直接进行Rowkey赋值的时候数据是浅拷贝的。为了深拷贝数据,往往提供一个MemBuffer或者StringBuffer,将源rowkey的数据memcpy到缓冲区(buffer),然后再将目的rowkey的指针指向buffer。2.Rowkey计算Hash  在老版本OB中,rowkey的hash值是通过murmurhash函数计算,输入是......
  • 【求解】下面这些标签能概括为哪些大类呢
    【求解】下面这些标签能概括为哪些大类呢?有没有现成的分类法?或者您有山寨分类法吗?诺基亚专家背包客驴子咨询师自由撰稿人自由摄影师编织围脖心情宅女散文摄影基督徒厨师养生食疗美食营养师法布雷加斯twitter西班牙语茉莉花茶摄影新闻读书电影设计喜欢......
  • 【解析】实现家庭语音识别系统需要考虑哪些因素?
    目录1.引言2.技术原理及概念3.实现步骤与流程4.应用示例与代码实现讲解5.优化与改进家庭语音识别系统是人工智能技术在家庭应用领域的一个重要应用,可以实现语音控制家居设备、语音交互、语音报警等功能,提升家庭生活的便捷性和安全性。本文将介绍实现家庭语音识别系统需要考......
  • After Effects 2023发布,有哪些值得关注的新功能?
    AfterEffects2023(版本23.4)发布有哪些值得关注的新功能?AE2023改进了用户请求的工作流程并进行了重要修复,用户可在AfterEffects中更高效地工作,在不影响创意构想的情况下设计更加优质的细节。AE2023forMacAE2023新增功能如下:文本和形状图层的“属性”面板可在易于......
  • NFT数字藏品平台在我国经营需要哪些资质牌照呢?
    (一)区块链信息服务备案NFT的上链、交易等都离不开区块链,根据《区块链信息服务管理规定》规定,需通过国家互联网信息办公室区块链信息服务备案管理系统(bcbeian.ifcert.cn/index)履行备案手续。若平台还属于区块链信息服务提供者(如自带上链服务),则还需履行用户信息认证等义务。(二)增......
  • pyqt5 本来程序是不卡的,但是点多几次后就很卡,原因可能有哪些?
    线程阻塞:如果您的程序执行了一些长时间运行的操作(如网络请求、文件读写等),并且这些操作在主线程中执行,那么它们可能会阻塞用户界面的响应。解决方法是将这些长时间运行的操作放在单独的线程中执行,以确保主线程保持响应。大量计算或循环:如果您的程序包含大量计算密集型的操作或......
  • C++面试八股文:在C++中,你知道哪些运算符?
    C++面试八股文:在C++中,你知道哪些运算符?某日二师兄参加XXX科技公司的C++工程师开发岗位第11面:面试官:在C++中,你都知道都哪些运算符?二师兄:啥?运算符?+-*/=这些算吗?面试官:嗯,还有其他的吗?二师兄:当然还有,+=,-=,*=,/=,==,还有逻辑运算,位运算等。面试官:好的。那你知道这些运算......
  • 自动驾驶中的行人检测技术有哪些?(二)
    在智慧交通领域,行人检测已经取得了不少成就。利用图像分割、深度学习等计算机视觉技术,行人检测为自动驾驶行业发展提供了重要的技术保障,使得自动驾驶车辆能够更加准确地感知和理解周围环境,并做出更加智能和安全的决策。下面,本文将继续介绍自动驾驶中常见的行人检测技术。 一......
  • 武汉星起航:亚马逊卖家在prime day来临之际需要做好哪些准备
    PrimeDay是亚马逊年度最大的促销活动之一,对于卖家来说是一个重要的销售机会。为了充分利用PrimeDay的潜力,星起航认为卖家需要在活动来临之前做好以下准备工作:库存管理:首先,卖家需要评估自己的库存情况。根据过去的销售数据和PrimeDay的预期需求,合理规划库存,确保能够满足潜在的订......
  • web worker进程和线程的区别,Chrome 中有哪些常⻅进程,如果我有⼀个耗时很⻓的同步计算
    进程(Process)和线程(Thread)都是操作系统中用于多任务处理的概念。简单地说,一个进程就是一个程序的执行空间,而一个线程则是在执行空间内独立运行的执行路径。区别:进程是系统分配资源的最小单位,线程是操作系统调度的最小单位。各个进程之间是独立的,各个线程之间共享一些资源。创......