OceanBase里面的rowkey是什么概念,是由哪些要素构成的?
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是什么概念,是由哪些要素构成的?的更多相关文章
- Java基本概念(2)J2EE里面的2是什么意思
J2EE里面的2是什么意思 J2SE,J2SE,J2ME中2的含义要追溯要1998年.1998年Java 1.2版本发布,1999年发布Java 1.2的标准版,企业版,微型版三个版本,为了区分这三个 ...
- 友盟推送里面的Alias怎么用?可以理解成账号吗?
友盟推送里面的Alias怎么用?可以理解成账号吗? 我们的App有自己的账号体系的,想在每次用户登陆的时候,给用户发一个欢迎消息. 看了一下友盟推送,里面有一个概念叫做Alias(别名),但是官方文档 ...
- procps包里面的sysctl命令
procps包里面的sysctl命令 --http://www.cnblogs.com/createyuan/p/3740917.html?utm_source=tuicool&utm_med ...
- 如何才能通俗易懂的解释javascript里面的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- openstack里面的Provider network 和 Tenant network 的区别
openstack里面的Provider network 和 Tenant network 的区别 openstack里面的网络相对复杂.经常有人对几个网络概念搞混淆,这里基本说明下 Openstac ...
- Activity往另外一个Activity传值,Fragment获取另外一个Activity里面的值。
在oneActivity中实现跳转到MainActivity //intent 用来跳转另外一个MainActivity,bundle传值到MainActivity Intent Ma ...
- 在wex5平台grid里面的gridselect下拉不能显示汉字问题
当grid里面有gridSelect组件的时候,gridSelect里面的bind-ref是对应的数据库存入字段(int类型),bind-labelRef是对应的计算字段(视图里面的),而option ...
- dede文章调用时过滤调 body里面的style属性和值
dede 发布文章的时候会在里面的标签中添加一些style 属性,现在改网站想去掉这些属性和里面的值,因为文章太多所以就用下面的方法 \include\arc.listview.class.php 在 ...
- 提取数据库字段里面的值,并改变+图片懒加载,jquery延迟加载
要求:手机端打开某个页面的详细信息,因为网速或者别的原因,响应太慢,因为图片大的原因,希望先进来,图片在网页运行的情况再慢慢加载(jquer延迟加载) http://www.w3cways.com/1 ...
随机推荐
- django中外键关联表的查询随笔
django中,如果一个数据库中的表之间有外键的话可以方便的通过一个表查询到其相关表的数据.如有下面三个model:class Blog(models.Model): name = models ...
- 1008: [HNOI2008]越狱
n个人,m种信仰: 问你相邻的人信仰不同的情况有多少种? 首先第一个人有m种选择,第二个人有m-1种选择,后面所有的人都只有m-1种选择: 所以结果就是m^n-m*(m-1)^(n-1) #inclu ...
- 练习--LINUX进程间通信之无名管道PIPE
IBM上放的这个系统不错,刚好可以系统回温一下LINUX的系统知识. http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/ 感觉年纪大了,前几 ...
- linux zip 命令详解
功能说明:压缩文件. 语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时 ...
- 转载爱哥自定义View系列--文字详解
FontMetrics FontMetrics意为字体测量,这么一说大家是不是瞬间感受到了这玩意的重要性?那这东西有什么用呢?我们通过源码追踪进去可以看到FontMetrics其实是Paint的一个内 ...
- HDU 2493 Timer 数学(二分+积分)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2493 题意:给你一个圆锥,水平放置,圆锥中心轴与地面平行,将圆锥装满水,在圆锥某一表面开一个小洞,流出来 ...
- 学习笔记-[Maven实战]-第三章:Maven使用入门(2)
使用maven执行编译和测试 1.maven执行编译 (1).在pom.xml上点右键,选择Maven build... (2).在Goals里输入clean complie,执行编译 执行结果: [ ...
- 精通phthon的条件
1. 熟知主流硬件体系(x86, x64)2. 熟知 CPython 的具体实现,如若可能至少通读源码三遍以上3. 熟知每条 Python bytecode 如何被解释执行4. 熟知每条 Python ...
- 逻辑运算符&& 用法解释
A&&B 首先判断A,A成功然后判断B:A不成功则结束判断,返回false;
- 函数 flst_get_first
/********************************************************************//** Gets list first node addre ...