Client 常见问题
关于select
在包括3.55.0版本以上,select的语法是类SQL的,where语句支持各样的过滤条件,client能够分析条件表达式,决策选择不一样的请求进行查询,
- 优先匹配主键,即条件表达式包含主键时,使用主键查询
- 次优先匹配本地索引
- 如果表配置了全局索引,再匹配全局索引
- 以上都不匹配的话,则全表遍历,此时select和dump是等价的
字符串转义
字符串支持 类C语言 风格的字符转义,如 \\, \t, \"等。
关于TDR表的二进制字段的赋值
Client工具使用SQL对字段赋值时,如insert或update,仅支持对一级字段赋值。
赋值的右值使用16进制的文本形式,如value_field = 0x112233。
以下类型都属于二进制类型:
- struct类型。
- 数组类型。注意,即使是char数组,也是二进制类型,而不是字符串类型。
<?xml version="1.0" encoding="GBK" standalone="yes" ?>
<metalib tagsetversion="1" name="tcaplus_tb" version="1" >
<struct name="test_table" version="1" primarykey="key" splittablekey="key" >
<entry name="key_data" type="string" size="64" desc="value" />
<entry name="value_length" type="int" desc="value_length" defaultvalue="0" />
<entry name="value_data" type="char" count="3" desc="value" refer="value_length" />
</struct>
</metalib>
如上示例的test_table的key_data是字符串类型,value_data是数组类型,插入数据的写法如下:
INSERT INTO test_table (key_data, value_length, value_data) VALUES ("abc", 3, 0x112233);
关于TDR表的数据修改
TDR表的SDK提供两种数据写入方式:
- SetData:整个记录按TDR协议打包写入,TcaplusDB能解析复杂类型字段(结构体、数组)。
- SetValue:逐个设置一级字段后再打包写入,TcaplusDB不解析复杂类型字段的嵌套内容。
二者必须配对使用:SetData 与 GetData 配对、SetValue 与 GetValue 配对,混用会因为复杂类型字段头部的 2 字节 TDR 版本号导致数据解析错乱。
默认情况下,client 的 insert / replace / update 走 SetValue 写入数据,对应 select 走 GetValue 查询输出各个一级字段数据;语句中使用 using tdr 关键字可以走 SetData / GetData 路径。
详细机理(包括 2 字节 TDR 版本头、混用后果、跨实例 TDR 元数据版本兼容等)见《TDR 表数据读写与版本兼容性》。
关于条件过滤
在包括3.55.0版本以上,select、update、delete均支持条件过滤,见详细语法,要求条件表达式必须包含主键。
注意,对于TDR表,条件过滤依赖于TDR的格式解析,当条件表达式包含嵌套字段时,如 WHERE key1=1 AND box.title="tcaplus",要求数据必须是 SetData 写入的(即语句中需带 using tdr),SetValue 写入的复杂类型字段数据无法被解析。背景见《TDR 表数据读写与版本兼容性》§3。
关于全表遍历
全表遍历(dump)比较低效,默认从slave副本上读取,可能会对开启了读分流的表产生影响。不推荐用户对正式环境中数据量较大的表执行全表遍历,如有相关需求,可以考虑分析型文本导出功能或与DBA沟通。
全表遍历默认是在slave副本上遍历的,注意比如dump命令导的过程中插入新的数据不会导出。
关于数据导出和导出
目前支持的数据格式是csv,其中对于TDR表,语句中使用 using tdr 关键字时,则的是xml格式tdr文件
若表存在复杂类型的字段(数组、结构体)
- TDR表,csv文件中以
0x前缀的16进制表示 - PB表,csv文件中以json字符串表示
当使用select into导出数据时,导出文件可能包含不止一条记录(因为不一定是全主键查询),而目前insert into、replace into只支持导入一条记录,多条记录需对应地使用load命令导入。