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_;
};

如果您对OceanBase感兴趣,请关注OceanBase官网:http://alibaba.github.io/oceanbase/

OceanBase里面的rowkey是什么概念,是由哪些要素构成的?的更多相关文章

  1. Java基本概念(2)J2EE里面的2是什么意思

    J2EE里面的2是什么意思 J2SE,J2SE,J2ME中2的含义要追溯要1998年.1998年Java 1.2版本发布,1999年发布Java 1.2的标准版,企业版,微型版三个版本,为了区分这三个 ...

  2. 友盟推送里面的Alias怎么用?可以理解成账号吗?

    友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档 ...

  3. procps包里面的sysctl命令

    procps包里面的sysctl命令 --http://www.cnblogs.com/createyuan/p/3740917.html?utm_source=tuicool&utm_med ...

  4. 如何才能通俗易懂的解释javascript里面的"闭包"?

    看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...

  5. openstack里面的Provider network 和 Tenant network 的区别

    openstack里面的Provider network 和 Tenant network 的区别 openstack里面的网络相对复杂.经常有人对几个网络概念搞混淆,这里基本说明下 Openstac ...

  6. Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。

    在oneActivity中实现跳转到MainActivity //intent 用来跳转另外一个MainActivity,bundle传值到MainActivity         Intent Ma ...

  7. 在wex5平台grid里面的gridselect下拉不能显示汉字问题

    当grid里面有gridSelect组件的时候,gridSelect里面的bind-ref是对应的数据库存入字段(int类型),bind-labelRef是对应的计算字段(视图里面的),而option ...

  8. dede文章调用时过滤调 body里面的style属性和值

    dede 发布文章的时候会在里面的标签中添加一些style 属性,现在改网站想去掉这些属性和里面的值,因为文章太多所以就用下面的方法 \include\arc.listview.class.php 在 ...

  9. 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载

    要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1 ...

随机推荐

  1. 【深度学习系列3】 Mariana CNN并行框架与图像识别

    [深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框 ...

  2. Firefly 性能测试 报告

    原地址:http://bbs.gameres.com/thread_223724.html Firefly 性能测试 主要考虑点 网络IO的并发 进程间通信压力 数据读写压力 测试机配置: 操作系统 ...

  3. 标准C++中的string类的用法总结(转)

    http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的 ...

  4. sql 复杂自动编号错误批量修改方案

    [一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/5133953.html]  前提:自动编号为18位,前4位是年份,中间10位是XXXX,最后四位 ...

  5. TYPE C PD测试板 UFP测试板

  6. Android TextView自动实现省略号

    TextView自带的可以通过 android:ellipsize="end" android:singleLine="true"实现单行省略,  但是当我们需 ...

  7. IPv6 tutorial 1 Get started now

    https://4sysops.com/archives/ipv6-part-1-get-started-now/ You’ve probably heard the news that the In ...

  8. NOI2011道路修建

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1974  Solved: 550[Submit][Status ...

  9. linq中的contains条件

    linq中的contains条件   在sql查询语句中,in 在linq 中用contains,并且contains前面是数组,而后面是列名,如: SELECT distinct BH FROM c ...

  10. Linux下的iwpriv(iwlist、iwconfig)的简单应用

    无线网络飞速发展的今天,许多设备都提供了连接无线网络的功能. 那么Linux下的wifi到底该怎么配置.连接呢?? 开始配置之前,我们要说说iw家族.iw是linux下常用的wifi配置工具,网上有相 ...