Global 和 Local 索引。
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
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
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'