目前的Doris支持两类索引
内建的智能索引,包括前缀索引和ZoneMap索引。
用户创建的二级索引,包括Bloom Filter索引和Bitmap倒排索引。
在排序的基础上,根据给定的前缀字段,快速查询数据的索引方式。
我们将一行数据的前36个字节,作为这一行数据的前缀索引。
当遇到varchar类型字段时,前缀索引终止。
举个例子一:
下表table_001的前缀索引是user_id(8Byte) + age(4Bytes) + message(前24个Bytes),凑成的36个字节
字段 | 类型 |
---|---|
user_id | bigint |
age | int |
message | varchar(100) |
max_dwell_time | datetime |
再举个例子二:
下表的前缀索引是user_name(20 Bytes),后面没有了。
因为前缀索引遇到varchar就会终止,user_name是varchar类型,所以即使user_name只有20个Bytes的长度,也不再往后继续。
字段 | 类型 |
---|---|
user_name | varchar(20) |
age | int |
message | varchar(100) |
max_dwell_time | datetime |
前缀索引在查询时的生效条件与mysql类似,最左匹配原则,支持范围查找(<, >, between, in等),遇到or会失效。
下面sql01能够命中前缀索引,而sql02不能命中
# sql01
select * from table_001 where user_id = 1 and age = 20 and message = 'haha' and max_dwell_time = xxx;
# sql02
select * from table_001 where age = 20 and message = 'haha' and max_dwell_time = xxx;
如果查询条件与表字段顺序不一样咋办呢?
这时可以利用rollup生成关联表,调整表字段。