Secondary Index

Secondary Index

mostly applied to Cassandra, HBase , mongoDB
二级索引的叶节点存储的是主键值,而不是行指针,
这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间

MySQL

MySQL Sample

  • InnoDB, clustered table
    聚簇索引表,表数据是和主键一起存储的,主键索引的叶结点存储行数据,二级索引的叶结点存储行的主键值
  • MyISAM, non-clustered table
    堆组织表,表数据和索引是分开存储的,主键索引和二级索引存储上没有任何区别

聚簇索引表最大限度地提高了I/O密集型应用的性能,但它也有以下几个限制:

  1. 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
  2. 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
  3. 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。
    二级索引的叶节点存储的是主键值,而不是行指针,这是为了减少当出现行移动或数据页分裂时二级索引的维护工作,但会让二级索引占用更多的空间。

HBase的二级索引

华为方案要点:

  1. 保证主表和索引表在同一个regionserver上(通过自定义的balancer实现)
  2. 使用coprocessor(触发器)实现索引表的创建和插入