由于性能原因,我们打算将关系型数据库转移到内存数据库中;在内存数据库产品的选型中,我们确定的候选对象有Redis和Berkeley DB;
Redis查询效率不错,并且支持丰富的数据存储结构,但不支持多索引,这样对于比较复杂的sql移植可能会造成数据膨胀;Berkeley DB只支持简单的Key/Value, 但支持多索引查询,对我们目前的应用来说,移植起来更有优势;
下面我们看看,如何为DB建立二级索引;
还是用例子来说明:
一张表中记录学生的信息;每个学生有个唯一的ID,这个id通常就是表的主键;
现在,我们希望通过学生的last_name来查询,这就需要建立二级索引;
注:用词约定:
* 本文提到的“数据库”是指Berkeley DB的database,相当于关系数据库的一个表。
作为SQL的常用表:
CREATE TABLE students(student_id CHAR(4) NOT NULL,lastname CHAR(15),
firstname CHAR(15), PRIMARY KEY(student_id)); CREATE INDEX lname ON students(lastname);
在Berkeley DB中,就是定义为如下结构:
struct student_record {
char student_id[4];
char last_name[15];
char first_name[15];
};
void second()
{
DB *dbp, *sdbp;
int ret;
/* 创建/打开第一个数据库*/
if ((ret = db_create(&dbp, dbenv, 0)) != 0)
handle_error(ret);
if ((ret = dbp->open(dbp, NULL,
"students.db", NULL, DB_BTREE, DB_CREATE, 0600)) != 0)
handle_error(ret);
/* 打开第二个数据库,注意,需要申明这个库支持重复记录,因为学生的last_name不是唯一的