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. js高手

    http://kb.cnblogs.com/page/173798/ http://kb.cnblogs.com/page/121539/ http://blog.jobbole.com/9648/ ...

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

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

  3. SGU 488 Dales and Hills

    这给题目和LIS类似,只不过是求连续的单调序列,用单调队列可破之,比如求LDIS(连续单增序列),如果a[i]大于栈顶元素入栈,将top作为序列长度,反过来再扫一遍就是包含该元素的单调递减序列,这样通 ...

  4. SQLite入门与分析(六)---再谈SQLite的锁

    写在前面:SQLite封锁机制的实现需要底层文件系统的支持,不管是Linux,还是Windows,都提供了文件锁的机制,而这为SQLite提供了强大的支持.本节就来谈谈SQLite使用到的文件锁——主 ...

  5. 【HDOJ】4455 Substrings

    5000ms的时限,还挺长的.算法是DP.思路是找到ans[1..n]的结果,然后Query就容易做了.问题是怎么DP?考虑:1 1 2 3 4 4 5w=1: 7, 7 = 1 * 7w=2: 10 ...

  6. Android开发之AlertDialog

    http://www.cnblogs.com/Gaojiecai/archive/2011/12/10/2283156.html http://www.2cto.com/kf/201205/13187 ...

  7. poj2079

    根据凸包的单峰性质,穷举第一个顶点然后先更新第三个顶点,再更新第二个顶点 ..] of longint; ans,n,t,k,i,j:longint; function cross(i,j,k:lon ...

  8. 以编程方式使用 Word 中的内置对话框

    使用 Microsoft Office Word 时,有时需要显示用户输入对话框.虽然可以创建自己的对话框,您也许还希望采用使用 Word 中内置对话框的方法,这些对话框在Application 对象 ...

  9. 【转】Java 类的生命周期详解

    一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...

  10. .Net 提交页面,js修改的Label值会丢掉

    <head id="Head1" runat="server"> <script src="../Jquery/jquery-1.1 ...