handlersocket 相关操作

来源:互联网 发布:舍利子到底是什么知乎 编辑:程序博客网 时间:2024/06/05 07:13
创建测试表:
root@test 04:53:11>show create table t;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(10) NOT NULL,
  `b` varchar(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `a_b` (`a`,`b`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=gbk |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1). 打开索引:
 P <indexid> <dbname> <tablename> <indexname> <columns> [<fcolumns>]
columns表示指定获取的列
fcolumns用于做过滤的列
各个字段用TAB进行分割,handlersocket将打开相应的index,并保持打开直到客户端关闭,重复打开相同的indexid将导致之前的index被关闭并重新打开。indexname='PRIMARY'表示主键索引
$sudo telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
P       1       test    t       primary id,a,b
2       1       idxnum
P       1       test    t       PRIMARY id,a,b
0       1
注意,这里的大小写是敏感的,另外primary后面的不是空格,而是tab

2).插入一条数据:
<indexid> + <vlen> <v1> ... <vn>
indexid是之前打开的索引id;
vlen是索引的列数,vlen不大于open_index时的columns个数紧随其后的是各列的值,对于不在其中的列,值被设为默认值
例如:
P       1       test    t       primary id,a,b
1       +       3       NULL    a4      b4
0       1       5
1       +       3       7       aaaaaaa bbbbbb
0       1       0

返回值0     1     表示执行成功
看起来,当自增列为NULL时,返回值中包含了自增列的值

3).更新/删除一条数据:
<indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...] MOD


op:用于支持比较操作,目前支持 = 、>、>=、<、<=
vlen:小于或等于索引的列的个数
LIM:<limit> <offset>
IN:  @ <icol> <ivlen> <iv1> ... <ivn>,icol要比索引列的个数小,
IN类似于SQL中的where语法
FILTER:<ftyp> <fop> <fcol> <fval>
ftyp值为 ‘F’(filter)或者‘W’(while)
fop指定比较操作,与op相似
fcol:必须比fcolumns要小
可以设置多个filter,这类似于where字句中的 ‘and’

MOD是一个类似如下的序列:
<mop> <m1> ... <mk>
mop的值包括: 
U   (update)
+   (increment)
-    (decrement)
D    (delete)
当在mop后面加?时,将返回修改前的数据
<m1>...<mk>,指定列的值
当执行delete操作时,即mop = D时,这些值会被忽略
当mop为+或-时,后面的值必须为整数
当mop为-时,若从负数变成正数或从正数变成负数,将不会改变列的值

例如,delete from test.t where id > 3 limit 1;
P       2       test    t       PRIMARY id,a,b
0       1
2       >       1       3       1       0       D
update test.t set a = 'aa', b = 'cc' where id = 3;
2       =       1       3       1       0       U       3       aa      bb
0       1       1

4). 查询数据:
<indexid> <op> <vlen> <v1> ... <vn> [LIM] [IN] [FILTER ...]
与3)类似,但没有mod操作
例如SQL操作:select id,b,a from test.t where id >= 5 limit 3
P       2       test    t       PRIMARY id,b,a
0       1
2       >=      1       5       3       0
0       3       5       b4      a4      7       bbbbbb  aaaaaaa 8       NULL    NULL



可以看出handlersocket还是有一些限制的:

1.无法支持比较复杂的查询,例如跨表、跨库的嵌套查询

2.必须要有索引

3.一些复杂的sql例如insert.....on duplicate key , insert.....select等类似的查询还无法支持



原创粉丝点击