InnoDB memcached多次获取和范围查询支持
该daemon_memcached
插件支持多种get操作(在单个memcached查询中获取多个键/值对)和范围查询。
多次获取操作
通过减少客户端与服务器之间的通信流量,可以在单个内存缓存查询中获取多个键值对,从而提高了读取性能。对于InnoDB
,这意味着更少的事务和开放表操作。
下面的示例演示多获取支持。该示例使用创建新表和列映射test.city
中描述的表。
mysql>USE test; mysql>SELECT *FROM test.city; +--------- +----------- +------------- +--------- +------- +------ +-------- + | city_id | name | state | country | flags | cas | expiry | +--------- +----------- +------------- +--------- +------- +------ +-------- + | B | BANGALORE | BANGALORE | IN | 0 | 1 | 0 | | C | CHENNAI | TAMIL NADU | IN | 0 | 0 | 0 | | D | DELHI | DELHI | IN | 0 | 0 | 0 | | H | HYDERABAD | TELANGANA | IN | 0 | 0 | 0 | | M | MUMBAI | MAHARASHTRA | IN | 0 | 0 | 0 | +--------- +----------- +------------- +--------- +------- +------ +-------- +
运行get
命令以检索city
表中的所有值。结果以键值对顺序返回。
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. get B C D H M VALUE B 0 22 BANGALORE|BANGALORE|IN VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN VALUE M 0 21 MUMBAI|MAHARASHTRA|IN END
在单个get
命令中检索多个值时,可以切换表(使用表示法)以检索第一个键的值,但不能为后续键切换表。例如,此示例中的表开关有效:@@containers.name
get @@aaa.AA BB VALUE @@aaa.AA 8 12 HELLO, HELLO VALUE BB 10 16 GOODBYE, GOODBYE END
不支持尝试在同一get
命令中再次切换表以从其他表中检索键值。
多重获取操作可以检索的键的数量没有限制,但是用于存储结果的内存限制为128MB。
范围查询
对于范围查询,该daemon_memcached
插件支持下列比较运算符:<
,>
,<=
,>=
。运算符之前必须带有@
符号。当范围查询找到多个匹配的键值对时,结果将按键值对顺序返回。
以下示例演示了范围查询支持。这些示例使用创建新表和列映射test.city
中描述的表。
mysql>SELECT *FROM test.city; +--------- +----------- +------------- +--------- +------- +------ +-------- + | city_id | name | state | country | flags | cas | expiry | +--------- +----------- +------------- +--------- +------- +------ +-------- + | B | BANGALORE | BANGALORE | IN | 0 | 1 | 0 | | C | CHENNAI | TAMIL NADU | IN | 0 | 0 | 0 | | D | DELHI | DELHI | IN | 0 | 0 | 0 | | H | HYDERABAD | TELANGANA | IN | 0 | 0 | 0 | | M | MUMBAI | MAHARASHTRA | IN | 0 | 0 | 0 | +--------- +----------- +------------- +--------- +------- +------ +-------- +
打开一个telnet会话:
telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'.
要获得大于的所有值B
,请输入get @>B
:
get @>B VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN VALUE M 0 21 MUMBAI|MAHARASHTRA|IN END
要获得小于的所有值M
,请输入get @<M
:
get @<M VALUE B 0 22 BANGALORE|BANGALORE|IN VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN END
要获得小于和包含的所有值M
,请输入get @<=M
:
get @<=M VALUE B 0 22 BANGALORE|BANGALORE|IN VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN VALUE M 0 21 MUMBAI|MAHARASHTRA|IN
要获得大于B
但小于的值M
,请输入get @>B@<M
:
get @>B@<M VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN END
最多可解析两个比较运算符,一个是“小于”(@<
)或“小于或等于”(@<=
)运算符,另一个是“大于”(@>
)或“大于或等于”运算符到(@>=
)运算符。假定任何其他运算符都是键的一部分。例如,如果您get
使用三个运算符发出命令,则将第三个运算符(@>C
)视为键的一部分,并且该get
命令将搜索小于M
和大于的值B@>C
。
get @<M@>B@>C VALUE C 0 21 CHENNAI|TAMIL NADU|IN VALUE D 0 14 DELHI|DELHI|IN VALUE H 0 22 HYDERABAD|TELANGANA|IN