MemSQL问世,查询速度可比传统数据库高出30倍
近日,Eric Frenkiel(前Facebook员工)和Nikita Shamgunov(前微软SQL Server高级工程师)推出了MemSQL数据库,该数据库的目标旨在提高关系型数据库的运行速度。

MemSQL通过将数据放置在内存中,并将SQL语句翻译为C++,来达到查询执行最优化。这使得MemSQL以难以置信的速度写入和读取数据。Frenkiel称,MemSQL比磁盘型数据库的执行速度快了30倍。

MemSQL提供了一个关系型接口,你可以将通常存储在暂时媒介(缓存或键值存储)中的数据进行统一,并连同现有数据直接放置到数据库中。

除了速度快外,对于开发者来说,MemSQL的另一个优势是可以与MySQL很好地结合。从本质上讲,当磁盘中的MySQL数据需要更少的性能和更高的持久性时,MemSQL则扮演一个高性能内存层的角色。MemSQL使用一个SQL接口和MySQL API,这意味着开发者不必学习新的东西。

MemSQL项目主页:http://memsql.com/
文档:http://developers.memsql.com/docs/1b/

因为机子不够折腾,就没去亲身体验了,下面copy了网页的体验记录。

点击右上角的下载链接  http://www.memsql.com/#download  ,它会要求你提供email等信息,提交后返回一个license key和下载链接,我们下载developer版的即可。

– 安装

$ tar -xzf memsqlbin_amd64.tar.gz
$ cd memsqlbin

– 启动

$ ./check_system
$ ./memsqld

注:

– check_system会告诉系统是否满足需求,比如内核版本,OS版本,64位 等等

– 启动的时候,要加 -u root,否则会报fatal错误;如果你已经有mysql在运行,那么可能需要更改默认启动端口3306为其他端口,比如 3307

./memsqld -u root --port 3307

– 如果你的RAM没有8G,启动的时候会有警告,但可以忽略。

– 测试

$ mysql -u root -h 127.0.0.1 -P 3306 --prompt="memsql> "

注: 这里-h不要使用localhost,用 127.0.0.1

进入命令行后就是标准的mysql客户端了。

memsql> show databases;

+——————–+
| Database           |
+——————–+
| information_schema |
| memsql             |
+——————–+

2 rows in set (0.00 sec)

建库:

memsql> create database chris001;

Query OK, 0 rows affected (0.08 sec)

memsql> show databases;

+——————–+
| Database           |
+——————–+
| information_schema |
| memsql             |
| chris001           |
+——————–+

3 rows in set (0.00 sec)

建表:

memsql> use chris001;

Database changed

memsql>

memsql> create table tab001 (id int primary key, name varchar(100), memo varchar(200),num int);

Query OK, 0 rows affected (6.71 sec)

memsql>

memsql>

memsql> show tables;

+——————–+
| Tables_in_chris001 |
+——————–+
| tab001             |
+——————–+

1 row in set (0.00 sec)

memsql> desc tab001;

+——-+————–+——+—–+———+——-+
| Field | Type         | Null | Key | Default | Extra |
+——-+————–+——+—–+———+——-+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(100) | YES  |     | NULL    |       |
| memo  | varchar(200) | YES  |     | NULL    |       |
| num   | int(11)      | YES  |     | NULL    |       |
+——-+————–+——+—–+———+——-+

4 rows in set (0.00 sec)

插入数据后查询:

memsql> insert into tab001 values (1,’chris’,’xxx’,100);

Query OK, 1 row affected (1.82 sec)

memsql>

memsql>

memsql> select * from tab001;

+—-+——-+——+——+
| id | name  | memo | num  |
+—-+——-+——+——+
|  1 | chris | xxx  |  100 |
+—-+——-+——+——+

1 row in set (0.71 sec)

memsql> select * from tab001;

+—-+——-+——+——+
| id | name  | memo | num  |
+—-+——-+——+——+
|  1 | chris | xxx  |  100 |
+—-+——-+——+——+

1 row in set (0.00 sec)
memsql> select * from tab001;

+—-+——-+——+——+
| id | name  | memo | num  |
+—-+——-+——+——+
|  1 | chris | xxx  |  100 |
+—-+——-+——+——+

1 row in set (0.00 sec)

memsql> select * from tab001;

+—-+——-+——+——+
| id | name  | memo | num  |
+—-+——-+——+——+
|  1 | chris | xxx  |  100 |
+—-+——-+——+——+

1 row in set (0.00 sec)

memsql> select count(0) from tab001;

+———-+
| count(0) |
+———-+
|        1 |
+———-+

1 row in set (0.63 sec)

memsql>

memsql> select count(0) from tab001;

+———-+
| count(0) |
+———-+
|        1 |
+———-+

1 row in set (0.00 sec)

memsql> select count(0) from tab001;

+———-+
| count(0) |
+———-+
|        1 |
+———-+

1 row in set (0.00 sec)

查询的时候,服务端会打出日志:

136674795 2012-06-19 10:02:31 INFO: Table chris001.tab001 compiled in 6709 miliseconds (3185 miliseconds for header)

136678436 2012-06-19 10:02:31 INFO: Table chris001.tab001 row size 80 bytes (base overhead 32 bytes, column id 4 bytes, column name 12 bytes, column memo 12 bytes, column num 8 bytes)

186966810 2012-06-19 10:03:21 INFO: Query chris001.’insert into tab001 values (?,?,?,?)’ compiled in 1825 miliseconds

194366714 2012-06-19 10:03:29 INFO: Query chris001.’select * from tab001′ compiled in 712 miliseconds

283342115 2012-06-19 10:04:58 INFO: Query chris001.’select count(0) from tab001′ compiled in 632 miliseconds

从以上测试我们看到,两次查询的首次和之后时间对比:

select * from tab001;                 (0.71 sec)       (0.00 sec)

select count(0) from tab001;     (0.63 sec)        (0.00 sec)

从日志可以知道,首次查询的耗时基本全都花在编译上了  。

– 关闭

$ killall memsqld

4 总结 

引用 MemSQL 网站的介绍

MemSQL 写道
MemSQL places data into memory and translates SQL into C++ for the utmost optimization in query execution. This enables MemSQL to write and read data at incredible speeds, and by offering a relational interface, you can unify the data you’d normally store in a short-lived medium—cache or key-value store—and place it directly into a database along with your existing data.

附: 软硬件要求

支持的部署环境,必须 64位

Distribution Minimum Version Command

Amazon AMI 2012.03 sudo yum install gcc-c++
CentOS 6.0 sudo yum install gcc-c++
Debian 6.0 sudo apt-get install g++
Fedora 15 sudo yum install gcc-c++
OpenSUSE 11.3 sudo zypper install gcc-c++
Red Hat 6.1 sudo yum install gcc-c++
Ubuntu 10.04 sudo apt-get install g++

硬件:

注:测试时RAM没有8G会有警告,不影响使用。