简介: 二级索引是关系型数据库相较于NoSQL数据库的一个要害差别。二级索引必须是强统一的,因而索引的写入须要与主键的写入放在一个事务当中,事务的性能是二级索引性能的根底。本次测试将重点关注不同分布式数据库的索引性能,特地关注业内全局索引的性能与MySQL索引的性能差别。为什么要做这个测试二级索引是关系型数据库相较于NoSQL数据库的一个要害差别。二级索引必须是强统一的,因而索引的写入须要与主键的写入放在一个事务当中,事务的性能是二级索引性能的根底。目前市面上的分布式数据库中,从应用体验的角度看支流有几种状态:以TiDB、CockroachDB等为代表的纯通明的用法。从体现上来看,该种类型的数据库所有表都是分布式表,并且不须要指定分区键,其外围逻辑是应用分布式事务来保护全局索引,并应用全局索引齐全代替单机数据库中的二级索引。以OceanBase等为代表的纯手动的用法。从体现上看,该种类型的数据库在不指定分区键的状况下,是以单表的模式存在的,不具备扩展性;创立分布式表须要应用相似分区表的语法。此类型的数据库个别也提供全局索引的能力(不提供的咱们个别称之为中间件而不是数据库)。但与第一类不同,它们个别会将全局索引作为一个可选项,由用户手动的指定与创立。此外,他们还会提供基于单机事务实现的本地索引(本地索引)。同时提供以上两种用法的PolarDB-X。在不指定分区键的状况下,与第一类数据库相似,应用分布式表+全局索引来提供通明的分布式体验;也容许手动指定分区键,应用本地索引等技术晋升性能。在之前的文章中《PolarDB-X 数据分布解读(四) :通明 vs 手动》,咱们提出:通明(主动)的易用性决定了分布式数据库的应用上限,但性能上是有更高的老本代价手动可能提供最优的性能,但应用门槛会有所增加分布式数据库须要为大多数场景提供可能通明应用的能力,也要为多数性能要求高的场景提供手动调优打消分布式事务的能力。这个观点的重要依据是,纯通明的模式实质上是应用分布式事务+全局索引来代替单机数据库中的事务+索引,而分布式事务+全局索引与单机事务+索引存在较大的性能差别。本次测试将重点关注不同分布式数据库的索引性能,特地关注业内全局索引的性能与MySQL索引的性能差别。本次测试的产品包含TiDB、OB、PolarDB-X、CockroachDB,选取这几个数据库有以下起因:他们都提供了强统一的全局索引能力,是数据库而不是中间件。都有开源,并且都有云产品提供,历史也都比拟悠久,材料比拟多,不是PPT数据库,容易搞清楚外部的原理。都是次要面向OLTP的数据库。此外咱们也测试了MySQL的索引性能作为比照。测试方法因为硬件配置(比方OB用了6台机器(并且租户设置上并没有占满整个机器),TiDB和TiKV用了5台,PolarDB-X和MySQL是间接公共云购买的等)、零碎参数等等,对于每个数据库来说,不是完全相同,也不肯定是最优的,所以间接比照TPS是没有意义的。咱们会将每个数据库,不带索引状况下,TPS可能达到的峰值作为基线(100%),比拟不同索引数目的性能绝对于基线的百分比。例如,产品A不带索引能跑到10W的TPS,带一个索引跑到5W,那咱们就认为带一个索引的状况下是基线的50%。这个百分比咱们无妨称之为TPS百分比。在产品之间的横向比照中,咱们会比照雷同索引数目下的TPS百分比,而不是TPS的绝对值。在测试TPS百分比的时候,咱们会调整并发度,来找到可能达到最大TPS的并发度,并以最大的TPS来计算TPS百分比。除了TPS百分比之外,咱们还会测试每个产品在不同索引数目状况下,单次写入的RT。在RT测试中,咱们会用单线程来进行写入。本次测试咱们只测试insert场景,这是索引写入的最根本的性能了。咱们应用sysbench的oltp_insert.lua制作流量。因为咱们要测试多个索引,因而咱们将sysbench的表构造做了批改,以MySQL为例,批改如下:CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL ,    `k1` int(11) NOT NULL ,    `k2` int(11) NOT NULL ,    `k3` int(11) NOT NULL ,    `k4` int(11) NOT NULL ,    `k5` int(11) NOT NULL ,    `k6` int(11) NOT NULL ,    `k7` int(11) NOT NULL ,    `k8` int(11) NOT NULL ,    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`)

);咱们在表中减少了8个列,依据测试的索引数目,会在这个8个列上创立相应数目的二级索引。同时咱们要批改oltp_insert.lua,在INSERT语句中减少这8个列,8个列的值随机生成,没有有序性,防止在基于range进行分区的数据库(TiDB、CockroachDB)上产生热点: con:query(string.format("INSERT INTO %s (id,k,k1,k2,k3,k4,k5,k6,k7,k8,c,pad) VALUES " ..

                             "(%d, %d,%d,%d,%d,%d,%d,%d,%d,%d,'%s','%s')",                          table_name, i, k_val, sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),sysbench.rand.default(1, sysbench.opt.table_size),c_val, pad_val))因为不同数据库的语法、个性等不同(当然还有一些坑),每个数据库的建表语句可能会做一些批改,每个数据库最终应用的建表语句放在附录中。软硬件环境本次测试应用的机器应用的是阿里云上购买的ECS,规格为ecs.i2g.8xlarge:


操作系统为阿里云上提供的CentOS 8.3:

所有机器均在同一个地区的同一个可用区内。所有数据库的数据文件均放在本地SSD中。所有数据库均会在后面挂一个SLB做负载平衡。sysbench应用的是1.0.20版本。测试后果

咱们能够看到,这些分布式数据库实现的全局索引中,即便只有1个索引,性能也都会上涨到30%以下,在8个索引的状况下,性能根本都会跌倒10%以下。而像MySQL这种单机数据库,8个索引的状况下,性能仍然放弃在85%以上。印证了咱们在《PolarDB-X 数据分布解读(四) :通明 vs 手动》 提到过的观点“分布式事务跟单机事务相比,在老本(或者说性能)上仍然存在不可逾越的鸿沟,这个差距至多在3倍以上”。应用全局索引代替单机数据库索引会带来很高的老本,在老本敏感型的场景中,须要适当的应用本地索引来升高应用老本。在提供了本地索引的数据库中:● PolarDB-X和OB的本地索引与主键具备Locality上的亲和性,能应用单机事务来对索引进行写入,绝对于全局索引,放弃了十分高的性能。● TiDB尽管提供了本地索引,但其索引和主键不具备Locality上的亲和性,无奈绑定到同一个机器上,因而其本地索引仍然要应用分布式事务进行保护,在性能上和全局索引没有太大差别,老本都很高。● CockroachDB的本地索引实践上与TiDB的行为相似,不过CockroachDB的partition性能是商业版才提供的,这次就没有进行测试了对于TiDB和CockroachDB来说,状况就比拟难堪了,因为他们所提供的所有索引,老本都要比单机MySQL高很多。作为用户没有任何伎俩能打消这个代价,除非,你不必二级索引。从RT的角度看:单机数据库因为事务的网络交互起码,RT体现的是最好的,并且跟索引的数量简直没有关系。分布式数据库的事务因为须要更多的跨节点交互,所以RT显著会比单机数据库更大。但因为分布式数据库在多分支的事务上个别都会采纳并行写入的策略,因而体现好的数据库RT并不会随索引数量的减少而线性减少。总体说来,RT能够承受。CockroachDB全局索引的RT体现是最差的,可能跟事务策略应用HLC无关,其余几个数据库应用的都是TSO的计划。TiDB全局索引的RT体现的是最好的,0-8个索引RT简直没有变动,阐明并行优化做的十分好。自家产品PolarDB-X全局索引的RT看起来还有优化的空间,尽管上涨无限,但并没有做到齐全的并行。咱们会在后续版本进行优化。本地索引RT十分稳固并且低。OB的全局索引和本地索引体现和PolarDB-X比拟相似,并行优化有晋升空间,本地索引体现不错。测试过程中的一个额定发现,TiDB、OB、CockroachDB的自增主键(auto_increment/serial)都有比较严重的性能问题,都要应用随机等代替计划。TiDB与CockroachDB是因为工夫序带来的热点range导致,OB可能是外部的一些锁导致。兼容性包含性能兼容与性能兼容,性能兼容之路漫漫...上面附上每个数据库测试的状况。测试详情MySQL环境配置版本:5.7.14-AliSQL-X-Cluster-1.5.1.8-20201229-log规格:32C128G,独享型阿里云购买:

测试后果

OceanBase环境配置版本:社区版 3.1.4

租户配置:CREATE RESOURCE UNIT unit1 MAX_CPU 16, MAX_MEMORY '32G', MAX_IOPS 12800,MAX_DISK_SIZE '1000G', MAX_SESSION_NUM 6400, MIN_CPU=8, MIN_MEMORY='16G', MIN_IOPS=12800;
CREATE RESOURCE POOL pool1 UNIT='unit1',UNIT_NUM=2,ZONE_LIST=('zone1','zone2','zone3');
CREATE TENANT idx_test CHARSET='utf8mb4', ZONE_LIST=('zone1','zone2','zone3'), PRIMARY_ZONE='zone1;zone2,zone3', RESOURCE_POOL_LIST=('pool1') ;须要留神的几点:OB中的表默认为单表(只散布在一个节点上),须要应用分区表的语法,指定分区键与分区数,能力成为一张分布式表OB默认的索引是本地索引,须要指定Global关键字才是全局索引OB的全局索引默认也是一个单表(只有一个分区,只散布在一个节点上),须要手动指定分区数才是一个真正的分布式索引UNIT_NUM=1的状况下,仿佛即便是分区表,也都在同一台机器上,所以测试机器数要>=6,确保UNIT_NUM>=2OB全局索引如果在建表语句中间接指定,仿佛不反对指定分区数,因而全局索引须要应用独自的CREATE INDEX语句来创立OB分区表的AUTO_INCREMENT属性仿佛有重大的性能问题,设置了之后,性能很低,要去掉该属性,并且将sysbench的auto_inc设为off,由sysbench来生成主键值OB默认应用的工夫服务是本地工夫服务(LTS),这种模式下是不反对全局索引的,须要手动批改为全局工夫服务(GTS):SET GLOBAL ob_timestamp_service='GTS';测试后果全局索引:

本地索引:

TiDB环境配置版本:6.1.0 部署构造:

须要留神的点:TiDB中语法上没有“全局索引”这个词,但从原理角度看,TiDB任何一张表都是分布式表,任何一个二级索引都是全局索引,它没有单表的概念不要应用AUTO_INCREMENT。TiDB中的AUTO_INCREMENT尽管是分段的,不保障自增间断,但拉长工夫后仍然是有肯定工夫序的,所以会导致热点。须要应用AUTO_RANDOM替换AUTO_INCREMENT。TiDB中反对Partition语法,但其Partition仍然构建于分布式KV之上,意味着每个Partition上面都对应着一个或多个TiKV中的range(留神,这里的range和partition语法中的range是两码事,parition语法中的一个range,也可能对应多个TiKV中的range),这些range是会被自在的调度的。在应用了Partition语法的表上创立的索引,在性能上也叫部分索引。测试后果全局索引:

本地索引:

CockroachDB环境配置版本:22.1.6

CDB与TiDB的架构是相似的,表构建于分布式KV之上,所有表都是分布式表,所有索引都是全局索引,没有单表的概念。须要留神的点:在CDB中,应用Serial类型主键(相似mysql中的auto_increment),或者应用unique_rowid()作为主键,因为这两个都是有肯定工夫序的,都会产生显著的热点,简直无奈应用。测试中应用UUID类型的列,并应用 gen_random_uuid()生成主键。这个实质是一个字符串,在KV层range的划分上能够认为是无序的。CDB每个连贯的代价比拟高,无奈创立太多的连贯测试后果全局索引:

PolarDB-X环境配置规格:私有云8C32G*2 版本:5.4.13 留神:建库时须要应用mode=auto,这种类型的数据库表不指定分区键的状况下是分布式表,同时索引是全局索引。索引前加Local关键字能够只创立Local索引测试后果全局索引:

本地索引:

附录OceanBase 全局索引建表语句create database sbtest_gsi8;
use sbtest_gsi8;
CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1) global partition by hash(k1) partitions 32;
create index k_2 on sbtest1(k2) global partition by hash(k2) partitions 32;
create index k_3 on sbtest1(k3) global partition by hash(k3) partitions 32;
create index k_4 on sbtest1(k4) global partition by hash(k4) partitions 32;
create index k_5 on sbtest1(k5) global partition by hash(k5) partitions 32;
create index k_6 on sbtest1(k6) global partition by hash(k6) partitions 32;
create index k_7 on sbtest1(k7) global partition by hash(k7) partitions 32;
create index k_8 on sbtest1(k8) global partition by hash(k8) partitions 32;

create database sbtest_gsi4;
use sbtest_gsi4;

CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1) global partition by hash(k1) partitions 32;
create index k_2 on sbtest1(k2) global partition by hash(k2) partitions 32;
create index k_3 on sbtest1(k3) global partition by hash(k3) partitions 32;
create index k_4 on sbtest1(k4) global partition by hash(k4) partitions 32;

create database sbtest_gsi2;
use sbtest_gsi2;
CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1) global partition by hash(k1) partitions 32;
create index k_2 on sbtest1(k2) global partition by hash(k2) partitions 32;

create database sbtest_gsi1;
use sbtest_gsi1;
CREATE TABLE sbtest1 (
id int(11) NOT NULL ,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1) global partition by hash(k1) partitions 32;

create database sbtest_gsi0;
use sbtest_gsi0;
CREATE TABLE sbtest1 (
id int(11) NOT NULL ,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;OceanBase 本地索引建表语句create database sbtest_local8;
use sbtest_local8;
CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1);
create index k_2 on sbtest1(k2);
create index k_3 on sbtest1(k3);
create index k_4 on sbtest1(k4);
create index k_5 on sbtest1(k5);
create index k_6 on sbtest1(k6);
create index k_7 on sbtest1(k7);
create index k_8 on sbtest1(k8);

create database sbtest_local4;
use sbtest_local4;

CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1);
create index k_2 on sbtest1(k2);
create index k_3 on sbtest1(k3);
create index k_4 on sbtest1(k4);

create database sbtest_local2;
use sbtest_local2;
CREATE TABLE sbtest1 (
id int(11) NOT NULL,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1);
create index k_2 on sbtest1(k2);

create database sbtest_local1;
use sbtest_local1;
CREATE TABLE sbtest1 (
id int(11) NOT NULL ,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;
create index k_1 on sbtest1(k1);

create database sbtest_local0;
use sbtest_local0;
CREATE TABLE sbtest1 (
id int(11) NOT NULL ,
k int(11) NOT NULL ,
k1 int(11) NOT NULL ,
k2 int(11) NOT NULL ,
k3 int(11) NOT NULL ,
k4 int(11) NOT NULL ,
k5 int(11) NOT NULL ,
k6 int(11) NOT NULL ,
k7 int(11) NOT NULL ,
k8 int(11) NOT NULL ,
c char(120) NOT NULL ,
pad char(60) NOT NULL ,
PRIMARY KEY (id)
) partition by hash(id) partitions 32;TiDB 全局索引建表语句create database sbtest8;
use sbtest8;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`),    KEY `k_5` (`k5`),    KEY `k_6` (`k6`),    KEY `k_7` (`k7`),    KEY `k_8` (`k8`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest4;
use sbtest4;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest2;
use sbtest2;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest1;
use sbtest1;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest0;
use sbtest0;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;TiDB 本地索引建表语句create database sbtest_local8;
use sbtest_local8;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`),    KEY `k_5` (`k5`),    KEY `k_6` (`k6`),    KEY `k_7` (`k7`),    KEY `k_8` (`k8`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 partition by hash(id) partitions 32;

create database sbtest_local4;
use sbtest_local4;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',        `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 partition by hash(id) partitions 32;

create database sbtest_local2;
use sbtest_local2;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 partition by hash(id) partitions 32;

create database sbtest_local1;
use sbtest_local1;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 partition by hash(id) partitions 32;

create database sbtest_local0;
use sbtest_local0;
CREATE TABLE sbtest1 (

    `id` bigint(11) NOT NULL AUTO_RANDOM,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 partition by hash(id) partitions 32;PolarDB-X全局索引建表语句drop database sbtest_gsi0;
drop database sbtest_gsi1;
drop database sbtest_gsi2;
drop database sbtest_gsi4;
drop database sbtest_gsi8;
create database sbtest_gsi8 mode=auto;
use sbtest_gsi8;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`),    KEY `k_5` (`k5`),    KEY `k_6` (`k6`),    KEY `k_7` (`k7`),    KEY `k_8` (`k8`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_gsi4 mode=auto;
use sbtest_gsi4;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`),    KEY `k_3` (`k3`),    KEY `k_4` (`k4`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_gsi2 mode=auto;
use sbtest_gsi2;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`),    KEY `k_2` (`k2`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_gsi1 mode=auto;
use sbtest_gsi1;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    KEY `k_1` (`k1`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_gsi0 mode=auto;
use sbtest_gsi0;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;PolarDB-X本地索引建表语句drop database sbtest_local0;
drop database sbtest_local1;
drop database sbtest_local2;
drop database sbtest_local4;
drop database sbtest_local8;
create database sbtest_local8 mode=auto;
use sbtest_local8;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    LOCAL KEY `k_1` (`k1`),    LOCAL KEY `k_2` (`k2`),    LOCAL KEY `k_3` (`k3`),    LOCAL KEY `k_4` (`k4`),    LOCAL KEY `k_5` (`k5`),    LOCAL KEY `k_6` (`k6`),    LOCAL KEY `k_7` (`k7`),    LOCAL KEY `k_8` (`k8`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_local4 mode=auto;
use sbtest_local4;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    LOCAL KEY `k_1` (`k1`),    LOCAL KEY `k_2` (`k2`),    LOCAL KEY `k_3` (`k3`),    LOCAL KEY `k_4` (`k4`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_local2 mode=auto;
use sbtest_local2;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    LOCAL KEY `k_1` (`k1`),    LOCAL KEY `k_2` (`k2`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_local1 mode=auto;
use sbtest_local1;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',            `k1` int(11) NOT NULL DEFAULT '0',    `k2` int(11) NOT NULL DEFAULT '0',    `k3` int(11) NOT NULL DEFAULT '0',    `k4` int(11) NOT NULL DEFAULT '0',    `k5` int(11) NOT NULL DEFAULT '0',    `k6` int(11) NOT NULL DEFAULT '0',    `k7` int(11) NOT NULL DEFAULT '0',    `k8` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`),    LOCAL KEY `k_1` (`k1`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

create database sbtest_local0 mode=auto;
use sbtest_local0;
CREATE TABLE sbtest1 (

    `id` int(11) NOT NULL AUTO_INCREMENT,    `k` int(11) NOT NULL DEFAULT '0',    `c` char(120) NOT NULL DEFAULT '',    `pad` char(60) NOT NULL DEFAULT '',    PRIMARY KEY (`id`)

) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;CockroachDB全局索引建表语句drop database sbtest1 CASCADE;
drop database sbtest2 CASCADE;
drop database sbtest4 CASCADE;
drop database sbtest8 CASCADE;

create database sbtest0;
use sbtest0;
CREATE TABLE sbtest1 (

    id UUID NOT NULL DEFAULT gen_random_uuid(),    k int NOT NULL ,            k1 int NOT NULL ,    k2 int NOT NULL ,    k3 int NOT NULL ,    k4 int NOT NULL ,    k5 int NOT NULL ,    k6 int NOT NULL ,    k7 int NOT NULL ,    k8 int NOT NULL ,    c char(120) NOT NULL ,    pad char(60) NOT NULL,    PRIMARY KEY (id)

);

create database sbtest1;
use sbtest1;
CREATE TABLE sbtest1 (

    id UUID NOT NULL DEFAULT gen_random_uuid(),                    k int NOT NULL ,            k1 int NOT NULL ,    k2 int NOT NULL ,    k3 int NOT NULL ,    k4 int NOT NULL ,    k5 int NOT NULL ,    k6 int NOT NULL ,    k7 int NOT NULL ,    k8 int NOT NULL ,    c char(120) NOT NULL ,    pad char(60) NOT NULL,    PRIMARY KEY (id),            INDEX k_1(k1)

);

create database sbtest2;
use sbtest2;
CREATE TABLE sbtest1 (

    id UUID NOT NULL DEFAULT gen_random_uuid(),    k int NOT NULL ,            k1 int NOT NULL ,    k2 int NOT NULL ,    k3 int NOT NULL ,    k4 int NOT NULL ,    k5 int NOT NULL ,    k6 int NOT NULL ,    k7 int NOT NULL ,    k8 int NOT NULL ,    c char(120) NOT NULL ,    pad char(60) NOT NULL,    PRIMARY KEY (id),            INDEX k_1(k1),            INDEX k_2(k2)

);

create database sbtest4;
use sbtest4;
CREATE TABLE sbtest1 (

    id UUID NOT NULL DEFAULT gen_random_uuid(),    k int NOT NULL ,            k1 int NOT NULL ,    k2 int NOT NULL ,    k3 int NOT NULL ,    k4 int NOT NULL ,    k5 int NOT NULL ,    k6 int NOT NULL ,    k7 int NOT NULL ,    k8 int NOT NULL ,    c char(120) NOT NULL ,    pad char(60) NOT NULL,    PRIMARY KEY (id),            INDEX k_1(k1),            INDEX k_2(k2),            INDEX k_3(k3),            INDEX k_4(k4)

);

create database sbtest8;
use sbtest8;
CREATE TABLE sbtest1 (

    id UUID NOT NULL DEFAULT gen_random_uuid(),    k int NOT NULL ,            k1 int NOT NULL ,    k2 int NOT NULL ,    k3 int NOT NULL ,    k4 int NOT NULL ,    k5 int NOT NULL ,    k6 int NOT NULL ,    k7 int NOT NULL ,    k8 int NOT NULL ,    c char(120) NOT NULL ,    pad char(60) NOT NULL,    PRIMARY KEY (id),        INDEX k_1(k1),        INDEX k_2(k2),        INDEX k_3(k3),        INDEX k_4(k4),        INDEX k_5(k5),        INDEX k_6(k6),        INDEX k_7(k7),        INDEX k_8(k8)

);欢送大家留言探讨。原文链接:https://click.aliyun.com/m/10... 本文为阿里云原创内容,未经容许不得转载。