今天群里面有人问了一个问题:很多公司用Solr对HBase建二级索引,是不是如果用了Trafodion,就可以把Solr完全替代?
针对Trafodion是否可以完全代替Solr这问题,至少现在看来我觉得是不会的,Trafodion目前来说是一个SQL on HBase的关系型数据库,而Solr是一个主要用来做搜索的产品,在这一点上Trafodion目前还没有比较好的解决方案可以替代Solr,Trafodion目前也就支持LIKE这种表达式实现文本的模糊匹配,但效率是可想而知的。
针对二级索引这个问题,我倒是可以谈谈我的看法。没错,Trafodion确实支持索引,而且我们一般称之为“二级索引”。为什么这么说呢?因为Trafodion表实质上是一个HBase表,HBase本身是一个Key-Value的NoSQL数据库,Key即Row-key,因此每个Trafodion表也有一个对应HBase表Row-Key的东西,称为“聚集键(Clustering Key)”,Trafodion表中的聚集键经过编码就是HBase表的Row-Key。
因此我们通常说,Trafodion表本身也是一个索引,因为Trafodion表中的数据会在插入的时候按照聚集键排好序,存储在表中的数据也是经过排序的,因此在按照聚集键进行查询的时候效率就比较高。
那么如果希望在非聚集键上进行查询时且希望效率依然很高的情况下应该怎么办呢?这时候就需要用到Trafodion索引了,这个索引又被称为“二级索引”,这个“二”是相对于Trafodion表这个“主”索引而言的。
(注意:Trafodion的二级索引其实质是一个HBase表。)
下面通过一个例子介绍如果创建一个简单的索引并查看DDL,
--创建测试表
SQL>create table test_index(a int not null, b varchar(10),primary key (a));
--- SQL operation complete.
SQL>showddl test_index;
CREATE TABLE TRAFODION.SEABASE.TEST_INDEX
(
A INT NO DEFAULT NOT NULL NOT DROPPABLE NOT
SERIALIZED
, B VARCHAR(10) CHARACTER SET ISO88591 COLLATE
DEFAULT DEFAULT NULL NOT SERIALIZED
, PRIMARY KEY (A ASC)
)
ATTRIBUTES ALIGNED FORMAT
;
--- SQL operation complete.
--在非主键列上创建索引
SQL>create index idx_test_index_b on test_index(b);
--- SQL operation complete.
SQL>showddl test_index;
CREATE TABLE TRAFODION.SEABASE.TEST_INDEX
(
A INT NO DEFAULT NOT NULL NOT DROPPABLE NOT
SERIALIZED
, B VARCHAR(10) CHARACTER SET ISO88591 COLLATE
DEFAULT DEFAULT NULL NOT SERIALIZED
, PRIMARY KEY (A ASC)
)
ATTRIBUTES ALIGNED FORMAT
;
CREATE INDEX IDX_TEST_INDEX_B ON TRAFODION.SEABASE.TEST_INDEX
(
B ASC
)
ATTRIBUTES ALIGNED FORMAT
;
--- SQL operation complete.
--插入测试数据
SQL>insert into test_index values(1, 'A');
--- 1 row(s) inserted.
SQL>insert into test_index values(2, 'B');
--- 1 row(s) inserted.
SQL>insert into test_index values(3, 'C');
--- 1 row(s) inserted.
SQL>select * from test_index;
A B
----------- ----------
1 A
2 B
3 C
--- 3 row(s) selected.
现在通过HBase Shell查看刚刚创建的表及索引,
hbase(main):008:0> list
...
TRAFODION.SEABASE.IDX_TEST_INDEX_B
...
TRAFODION.SEABASE.TEST_INDEX
...
hbase(main):001:0> scan 'TRAFODION.SEABASE.TEST_INDEX'
ROW COLUMN+CELL
\x80\x00\x00\x01 column=#1:\x01, timestamp=1487565603006, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
0\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00A\x00\x00\x00
\x80\x00\x00\x02 column=#1:\x01, timestamp=1487565613971, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
0\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00B\x00\x00\x00
\x80\x00\x00\x03 column=#1:\x01, timestamp=1487565622955, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
0\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00
3 row(s) in 0.4400 seconds
hbase(main):002:0> scan 'TRAFODION.SEABASE.IDX_TEST_INDEX_B'
ROW COLUMN+CELL
\x00\x00A \x80\x00\x00\x0 column=#1:\x01, timestamp=1487565603025, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
1 0\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00A\x00\x00\x00
\x00\x00B \x80\x00\x00\x0 column=#1:\x01, timestamp=1487565613973, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
2 0\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00B\x00\x00\x00
\x00\x00C \x80\x00\x00\x0 column=#1:\x01, timestamp=1487565622957, value=\x10\xC0\x00\x00\x0C\x00\x00\x00\x14\x00\x00\x00\x0
3 0\x00\x00\x00\x03\x00\x00\x00\x01\x00\x00\x00C\x00\x00\x00
3 row(s) in 0.0410 seconds