1. 程式人生 > >Global 和 Local 索引。

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

(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'