4.2. LSQL数据类型
4.2.1 SQL语句与表名、字段名
- 表名与字段名区分大小写,若表名和字段名为大写字母,则查询语句中表名、字段名必须为大写;
- 表名及字段名可以有数字、字母、下划线组成,不能以数字及_或者特殊字符开头,只能以字母开头;
- 表名和字段名不能包含关键词,如 or、and等;
- 分区:partition 不能大写;
- 基于RamIndexFilter的筛选:RamIndexFilter@0000000001:10240:over_rand@ 不能大写。
4.2.2 isdmpn 含义
i 表示 进行索引 indexed
s 表示 进行了行存储 stored
d 表示 进行了列存储 docValues
m 表示 多值列
p 表示 存储了词的偏移量 可以进行词的顺序模糊匹配
n 表示 既不索引也不存储(背景是:抛弃一些不需要的字段)
4.2.3 行存储于列存储
LSQL 数据库支持行存、列存、行存加列存。根据不同的业务场景使用不同的存储方式能够提高业务效率。
行存:只做查询(只有 select),不统计的情况下(count、avg、sum)推荐使用行存。
列存:做统计功能时,需要统计的字段必须为列存,行存无法使用。
字段做行存查询走行存,字段做列存查询走列存
字段做行存加列存查询时,查询的字段数以12为分界点,当查询的字段数小于 12 个时,查询优先走列存,当查询的字段数大于12 个时,查询优先走行存
就单独查询而言查询的字段小于12 个,列存类型效率高,查询的字段大于12 个,行存类型效率高。
带索引:可以走null匹配(采用暴力扫描,如果值比较多会触发过载保护,出现is null和is not null两者之和不等于总值的情况)
仅行存储:不可以走null匹配
带有列存储:可以走null匹配
4.2.4 基本数据类型
基本类型的存储方式有按列存储与按行存储两种方式;
4.2.5 分词类型
默认lsql可以支持所有的lucene的分词格式,也支持自定义的分词,由于分词格式理解比较难,默认仅暴露出text,textik,wildcard4类型。
4.2.6 多值列类型
多值列形式
多值列适合在一个列里面存储多个值,如存储一个标签数组。
- 多值列返回的值无序。
- 字符串多值列是去重的,int型是不去重。
- 多值列的数据请按照json数组传递如["北京","上海"]。
控制返回多值列结果格式
在/opt/software/lsql/config/site/lsql-site.properties配置文件加入以下参数:
sys.multival.join=space(此参数代表多值列返回结果按照空格分隔形式返回)
sys.multival.join=json (此参数代表多值列返回结果按照json数组形式返回,默认为此参数)
更新完配置文件需要重启LSQL。
4.2.7 对于时间的高效处理
数据里面时间格式是yyyy-MM-dd hh:mm:ss。
lsql没有时间类型,应该怎么处理
可以用tlong类型代替时间类型存储的值转换成 yyyyMMddhhmmss ,这样是定长的,而且可读性好(比unix时间戳可读性好)。如果时间精度是秒,毫秒,纳秒的话一定要使用 tlong(范围查找以及排序比long快很多倍,但会占用较多的存储空间),如果是天,小时的话,可以使用long 节省存储空间。
常见的用于时间操作的转换函数
cast (from_unixtime(unix_timestamp(substring(recevicetime,0,18),'dd-MMM-yy HH.mm.ss'),'yyyyMMddHHmmss') as bigint), cast (from_unixtime(unix_timestamp(substring(recevicetime,0,18),'dd-MMM-yy HH.mm.ss'),'yyyyMMddHHmm')as bigint), cast (from_unixtime(unix_timestamp(substring(recevicetime,0,18),'dd-MMM-yy HH.mm.ss'),'yyyyMMddHH')as bigint) , select (2017-cast(substring('201831198307123487',7,4) as bigint) );