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,那麼下次的插入將被忽略
作者 MySQL內核與性能優化