这里的索引和mysql的索引指的是一个意思,都是为了查询时提高速度,不同的是没有mysql那么多的种类,且实现原理也不同,mysql是使用树形结构等原理实现索引,且索引种类可以有多种供选择的种类,使用灵活,而phoenix的索引默认情况下,默认只有rowkey一个索引,而二级索引说的是以rowkey为中心,使得其他的字段和rowkey发生一种关联,总的来说phoenix的二级索引是一种牺牲存储空间换取查询时间的机制

且二级索引的使用需要配置,配置步骤见我之前发的原生集群搭建中

二级索引分为全局索引与本地索引,在工作中我们常用的是本地索引,因为它的性能高,理解上来说,可以理解为一个学校中所有学生是数据,校长是全局索引,辅导员是本地索引,虽然全局索引可以总管所有数据,但是无法对一个数据做到详细的了解,且一个数据发生变动,全局索引要跟着将一切的相关数据跟着变,而本地索引没有这样的缺陷,它的范围小,只管理自己的班级,可以对学生进行详细的追踪,且在使用上本地索引也比全局索引方便

而且在存储上两种索引也不一样,全局索引是用一张独立的表记录的,而本地索引,是在表自身内多出了一些索引数据

全局索引创建方式如下

//create index 索引名字 on 表名(二级索引关联列) include(触发列)
create index idx_staff_name on "staff1"("company"."address") include("company"."name");

全局索引,要想生效,要求查询的字段需要有触发字段,且查询条件有二级索引关联列,如下语句

select "name" from "staff1" where "address"=’dongguan’;

本地索引创建方式如下

//create local index 索引名字 on 表名(二级索引关联列)
create local index idx_staff_name on "staff1" ("company"."address");

本地索引没有全局索引的限制,且本地索引以表数据的形式存在,我们在hbase shell中scan一个表就会发现表中多出了索引数据,比如如下语句

select * from "staff1" where "address"=’dongguan’;

无论是那种索引当你要删除的时候使用如下语句就可以了

drop index idx_staff_name on "staff1"