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 ...
随机推荐
- xxx couldn't be loaded because it has not been added to the build settings.
这个由于没有将进入场景放入Build Settings里面造成的.
- PHP之关闭网页错误提示
关闭PHP错误脚本提示是程序上线了必须做的一件事情,就是不管程序怎么报错我们都不能让错误日志在服务器上给大家看到,下面我来总结两种关闭PHP错误脚本提示的具体方法 最简单的办法就是直接在php程序代码 ...
- 使用flask的时候遇到的问题及其解答
在网上看到了mircoblog的这个web程序,用flask框架写的,自己就在windows的环境下实现了下. 1.这个博客系统用到了一个flask插件叫flask_Login 里面涉及到编码解码的问 ...
- 数据库里面DataTime时间类型字段,如果为null时
tran.TransactionTime = bet.CreationDate.ToString() == "0001/1/1 0:00:00" ? DateTime.Now : ...
- Spring 配置XML文件头部文件格式
普通格式: <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns:xsi="ht ...
- 汇编语言第二版 程序在dos中执行情况.P86-87
假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...
- UVA 10608 Friends
题目大意:共有n个人,m对人为已知的朋友关系,而且这种关系具有传递性,也就是A与B,B与C是朋友,可以确定A与C是朋友,求一个人数最多的朋友团体. bfs就可以了,遇到未访问的结点,加入队列并且朋人数 ...
- MMU、Icache、Dcache
http://blog.csdn.net/iodoo/article/details/8954014 i-cache(instruction cache)是指令高速缓冲存储器. Cache存储体:存放 ...
- float 和 real
用于表示浮点数值数据的大致数值数据类型.浮点数据为近似值:因此,并非数据类型范围内的所有值都能精确地表示. 注意: real 的 SQL-92 同义词为 float(24). 数据类型 范围 存储 ...
- 自定义NavigationView's item 的高度
http://stackoverflow.com/questions/31204320/how-can-i-change-the-navigationviews-item-text-size 自定义s ...