MySQL消息存储引擎Q4M试玩_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1920 | 回复: 0   主题: MySQL消息存储引擎Q4M试玩        下一篇 
Koei111
注册用户
等级:列兵
经验:81
发帖:42
精华:0
注册:2011-7-22
状态:离线
发送短消息息给Koei111 加好友    发送短消息息给Koei111 发消息
发表于: IP:您无权察看 2014-12-24 14:34:41 | [全部帖] [楼主帖] 楼主

1. 安装
下载二进制包:
由于我的mysql是5.1.48,从官网选择对应的包

http://q4m.kazuhooku.com/dist/old/


下载后解压
a. 将support-files/q4m-forward  拷贝到mysql安装目录/bin下
b. 将libqueue_engine.so 拷贝到mysql安装目录/lib/mysql/plugin下
执行:

$cat support-files/install.sql  www.2cto.com
INSTALL PLUGIN queue SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_wait RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_end RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_abort RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_rowid RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_set_srcid RETURNS INT SONAME 'libqueue_engine.so';
CREATE FUNCTION queue_compact RETURNS INT SONAME 'libqueue_engine.so';


这时候Queue引擎的状态还是disable,重启一下mysqld就变成active了。

root@test 05:50:59>show plugins;
+---------------------+--------+--------------------+---------------------+---------+
| Name                | Status | Type               | Library             | License |
+---------------------+--------+--------------------+---------------------+---------+
| binlog              | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| partition           | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| CSV                 | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| MEMORY              | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| MyISAM              | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| MRG_MYISAM          | ACTIVE | STORAGE ENGINE     | NULL                | GPL     |
| InnoDB              | ACTIVE | STORAGE ENGINE     | ha_innodb_plugin.so | GPL     |
| INNODB_TRX          | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_LOCKS        | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_LOCK_WAITS   | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_CMP          | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_CMP_RESET    | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_CMPMEM       | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | ha_innodb_plugin.so | GPL     |
| QUEUE               | ACTIVE | STORAGE ENGINE     | libqueue_engine.so  | GPL     |
+---------------------+--------+--------------------+---------------------+---------+


安装完毕,可以开始玩一把了。
2.
a.创建一个QUEUE表

root@test 05:52:29>create table t1 (a int , b varchar(100)) engine=queue;
Query OK, 0 rows affected (0.00 sec)


尝试插入一条数据:  www.2cto.com 

root@test 05:52:51>insert into t1 values (1,"sd");
ERROR 1598 (HY000): Binary logging not possible. Message: Statement cannot be logged to the binary log in row-based nor statement-based format


咿?插入失败,看样子Queue不支持binlog复制。好吧,重启把binlog禁用掉。再次执行

root@test 05:57:03>insert into t1 values (1,"sd");
Query OK, 1 row affected (0.01 sec)


这下插入成功了

root@test 05:57:13>insert into t1 values (2,"sda"),(3,"fio"),(4,"sas");
Query OK, 3 rows affected (0.00 sec)
---------------------////--------------------


以下内容有些是参考自官方的一个PPT。

------------------////-------------------------


那么QUEUE存储引擎和其他存储引擎(例如Innodb)有什么不同呢?
——不支持主键和索引
——支持insert/delete,但不支持update
——根据插入数据的顺序进行排序
——缓存select count(*)
另外该存储引擎使用了多个定义的函数来简化操作,堪称傻瓜式!!!!

针对每个连接有两种模式:OWNER模式和Non-Owner模式,在进入owner模式后,该连接所拥有的数据对其他连接而言是不可见的。
模式的切换使用函数来实现:
a).进入Owner模式
通常情况下,在发起连接后,处于Non-Owner模式,当调用函数Queue_wait()时,进入Owner 模式,根据传递给queue_wait函数的参数,会等待直到可以获得一行数据,在这之后,这行数据对其他连接而言是不可见的。
Queue_wait的参数类似于如下格式:

select * from t1 where  queue_wait(“t1”);


等待获得t1内的一行数据,默认超时时间为60秒

Select * from t1 where  queue_wait(“t1: a<4”)
----等待a<4的数据行  www.2cto.com 


注:只支持检查数值类型的行

Select  queue_wait(“t1”,”t2”,30)


检查t1或t2表是否有记录,若获得t1表记录,返回1,若是t2表,则返回2,若是30秒超时,返回0
b)退出owner模式
有两种方式:
(1).调用queue_end()删除之前由queue_wait获得的行记录并返回到Non-Owner模式
(2)调用 queue_abort()释放拥有的行,但不删除。关闭连接与queue_abort()的效果相同。
3.内部行Id
每一行都有一个内建64位的Row ID,主要用于检测冲突。

Queue_rowid()
----返回当前连接拥有的行的RowId,如果不拥有任何行,则返回NULL
queue_set_srcid(src_tbl_id, mode, src_row_id)


src_tbl_id:用于定义源表
mode: a表示删除重复行,w表示重置
src_row_id:从源表获得的row id
该函数用于检查记录是否已经插入了目标表里,如果为true,那么下次的插入将被忽略

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论