1、创建表:
create table immutable_local (id varchar not null primary key, cf1.a varchar, cf1.b varchar, cf2.c varchar, cf2.d varchar ) immutable_rows=true;
create table immutable_global (id varchar not null primary key, cf1.a varchar, cf1.b varchar, cf2.c varchar, cf2.d varchar ) immutable_rows=true;
create table mutable_local (id varchar not null primary key, cf1.a varchar, cf1.b varchar, cf2.c varchar, cf2.d varchar ) immutable_rows=false;
create table mutable_global (id varchar not null primary key, cf1.a varchar, cf1.b varchar, cf2.c varchar, cf2.d varchar ) immutable_rows=false;
2、创建索引:
create index index_mutable_global on mutable_global(a,c) include(b); 成功
create local index index_mutable_local on mutable_local(a,c) include(b); 成功
create index index_immutable_global on immutable_global(a,c) include(b); 成功
create local index index_immutable_local on immutable_local(a,c) include(b); 失败,immutable 表无法创建Local .
Error: ERROR 1048 (43A04): Local indexes aren't allowed on tables with immutable rows. tableName=INDEX_IMMUTABLE_LOCAL (state=43A04,code=1048)
3.插入数据
upsert into mutable_global values ('100001','a1','b1','c1','d1');
upsert into mutable_global values ('100002','a2','b2','c2','d2');
upsert into mutable_local values ('100001','a1','b1','c1','d1');
upsert into mutable_local values ('100002','a2','b2','c2','d2');
upsert into immutable_global values ('100001','a1','b1','c1','d1');
upsert into immutable_global values ('100002','a2','b2','c2','d2');
4、测试检索
检索中包含了列d, 此列不包含在索引中。
a、immutable 表使用的时全表扫描,没有使用索引
explain select a,b,c,d from immutable_global where a='a1';
CLIENT PARALLEL 1-WAY FULL SCAN
OVER IMMUTABLE_GLOBAL
SERVER FILTER BY CF1.A = 'a1'
b、mutable 表使用的时全表扫描,没有使用Global索引
explain select a,b,c,d from mutable_global where a='a1';
CLIENT PARALLEL 1-WAY FULL SCAN OVER MUTABLE_GLOBAL
SERVER FILTER BY CF1.A = 'a1'
c、mutable 表使用了 LOCAL 索引
explain select a,b,c,d from mutable_local where a='a1';
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a1'] |
CLIENT MERGE SORT
5、Local 索引细节
索引定义:create local index index_mutable_local on mutable_local(a,c) include(b);
a、使用部分索引:索引组合的第一个
explain select a,b,c,d from mutable_local where a='a1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN
OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a1']
CLIENT MERGE SORT
b、使用部分索引:索引组合的第二个
explain select a,b,c,d from mutable_local where
c='c1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768]
SERVER FILTER BY C = 'c1'
CLIENT MERGE SORT
c、使用部分索引:include的部分
explain select a,b,c,d from mutable_local where b='b1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768]
SERVER FILTER BY CF1.B = 'b1'
CLIENT MERGE SORT
d、使用全部索引
explain select a,b,c,d from mutable_local where a='a1' and c='c1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a1','c1']
CLIENT MERGE SORT
调换a和c的位置,phoenix会自动优化。
explain select a,b,c,d from mutable_local where c='c1' and a='a1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a1','c1']
CLIENT MERGE SORT
e、使用索引中全部字段
explain select a,b,c,d from mutable_local where c='c1' and b='b1' and a='a1' ;
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a1','c1']
SERVER FILTER BY CF1.B = 'b1'
CLIENT MERGE SORT
f、使用了不存在于索引中的字段。
explain select a,b,c,d from mutable_local where a='a1' and d='d1';
CLIENT PARALLEL 1-WAY FULL SCAN OVER MUTABLE_LOCAL
SERVER FILTER BY (CF1.A = 'a1' AND CF2.D = 'd1')
g. 在Select 中不要使用*,*会导致全表扫描
explain select a,b,c,d from MUTABLE_LOCAL where a='a';
CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_MUTABLE_LOCAL [-32768,'a']
CLIENT MERGE SORT
explain select * from MUTABLE_LOCAL where a='a';
CLIENT PARALLEL 1-WAY FULL SCAN OVER MUTABLE_LOCAL
SERVER FILTER BY CF1.A = 'a'