1、全局索引和本地索引的作用
· 本地索引
分区表的本地索引和非分区表的本地索引类似,索引的数据结构和主表的数据结构保持一对一的对应关系,但由于主表已经做了分区,主表的“每一个分区”都会有自己单独的索引数据结构。对每一个索引数据结构来说:里面的键(Key)只映射到自己分区中的主表数据,不会映射到其它分区中的主表,因此这种索引被称为本地索引。本地索引的分区方式和分区键与主表相同,但无法做到全局唯一性约束。
· 全局索引
和分区表的本地索引相比,分区表的全局索引不再和主表的分区保持一对一的关系, 而是将所有主表分区的数据合成一个整体来看,索引中的一个键可能会映射到多个主表分区中的数据(当索引键有重复值时)。更进一步,全局索引可以定义自己独立的数据分布模式,既可以选择非分区模式也可以选择分区模式;在分区模式中,分区的方式既可以和主表相同也可以和主表不同。全局索引可以有非分区和分区模式,分区也可以是独立的分区方式和分区键。
全局索引非必要不要随便用;一般都是有全局唯一的需求,或者是能明确通过全局索引能提升用户场景请求的性能。
2、受影响的场景
分区表场景
· 分区表的全局索引对性能的影响:
缺点:对修改操作的影响很大,一个简单的 DML 语句都会因为要同步修改全局索引而产生分布式事务,影响性能。
优点:可以做到全局唯一性约束,某些业务兼容性更友好。
· 分区表的本地索引对性能的影响:
优点:只对对应的 Partition 进行索引。不会涉及全局的修改;仅是本地事务,对性能相对友好。
缺点:缺少全局唯一性约束。
非分区表场景
非分区表的全局索引在 SCHEMA 上是全局索引,但是实际存储和 local 索引是一样的;也可以理解为:非分区表没有全局索引的说法。
结论:
在非分区表场景,全局索引和 LOCAL 索引对性能的影响没有区别。
在分区表场景,全局索引涉及全局的 DML 修改,对性能有消极影响。
一般来说,Sysbench 、TPCH、BMSQL均建议使用本地索引。




