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. codeforces 391C3 - The Tournament

    在第8组数据上WA了一天,后来才发现问题: #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  2. jsp include包含html页面产生的乱码问题

    大家都知道在jsp中include的有两种方式,一种是<jsp:include page="">,另一种是<%@ include file="" ...

  3. [jobdu]数组中出现次数超过一半的数字

    找到以后要再扫一遍确认. http://zhedahht.blog.163.com/blog/static/25411174201085114733349/ #include <iostream ...

  4. Android 获得屏幕的宽高度

    在View构造函数中获得屏幕的宽高 public class GameView extends View { public GameView(Context context) { Display d ...

  5. Android DownloadThread.run()学习

    android系统的下载代码写的很好,考虑的比较全面,值得我们学习.DownloadThread是其中执行下载的部分,下面从run进行研究. run(){ 一上来会设置一下下载线程的优先级:THREA ...

  6. Android 内核初识(6)SystemServer进程

    简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityM ...

  7. 物联网操作系统HelloX V1.77(beta)版本发布

    物联网操作系统HelloX V1.77发布 经过近半年的努力,物联网操作系统HelloX V1.77版本正式完成,源代码已上载到github(github.com/hellox-project/Hel ...

  8. Matlab工具箱安装体会

    总结有两点: 1.如需添加jar包等附加库,可在待安装工具箱下,新建一个java文件夹,并将jar包等文件存放在里面,然后执行以下操作: 1)Create or open your preferenc ...

  9. Chrome的隐身模式

    先来说说隐身模式的启用方法吧 1.键盘快捷:Ctrl + Shift + N. 2.在Windows7下的任务栏处,右击“Chrome”图标,会出一个下拉菜单,点击“新建隐身窗口”. 3.你还可以在一 ...

  10. sharepoint2010网站根据权限隐藏ribbon

    转:http://www.it165.net/design/html/201302/1734.html 项目要求让普通用户看不到"网站操作",为了解决该问题,我找了好几篇博客,但都 ...