Secondary Index
mostly applied to Cassandra, HBase , mongoDB
二级索引的叶节点存储的是主键值,而不是行指针,
这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间
MySQL
- InnoDB, clustered table
聚簇索引表,表数据是和主键一起存储的,主键索引的叶结点存储行数据,二级索引的叶结点存储行的主键值 - MyISAM, non-clustered table
堆组织表,表数据和索引是分开存储的,主键索引和二级索引存储上没有任何区别
聚簇索引表最大限度地提高了I/O密集型应用的性能,但它也有以下几个限制:
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
- 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
- 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
二级索引的叶节点存储的是主键值,而不是行指针,这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间。
HBase的二级索引
华为方案要点:
- 保证主表和索引表在同一个regionserver上(通过自定义的balancer实现)
- 使用coprocessor(触发器)实现索引表的创建和插入