TiDB、OceanBase、PolarDB-X、CockroachDB 二级索引写入性能测评

为什么要做这个测试

二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础。

目前市面上的分布式数据库中,从使用体验的角度看主流有几种形态:

  1. 以TiDB、CockroachDB等为代表的纯透明的用法。从表现上来看,该种类型的数据库所有表都是分布式表,并且不需要指定分区键,其核心逻辑是使用分布式事务来维护全局索引,并使用全局索引完全替代单机数据库中的二级索引。
  2. 以OceanBase等为代表的纯手动的用法。从表现上看,该种类型的数据库在不指定分区键的情况下,是以单表的形式存在的,不具备扩展性;创建分布式表需要使用类似分区表的语法。此类型的数据库一般也提供全局索引的能力(不提供的我们一般称之为中间件而不是数据库)。但与第一类不同,它们一般会将全局索引作为一个可选项,由用户手动的指定与创建。此外,他们还会提供基于单机事务实现的本地索引(本地索引)。
  3. 同时提供以上两种用法的PolarDB-X。在不指定分区键的情况下,与第一类数据库类似,使用分布式表+全局索引来提供透明的分布式体验;也允许手动指定分区键,使用本地索引等技术提升性能。

在之前的文章中《PolarDB-X 数据分布解读(四) :透明 vs 手动》,我们提出:

  1. 透明(自动)的易用性决定了分布式数据库的使用下限,但性能上是有更高的成本代价
  2. 手动能够提供最优的性能,但使用门槛会有所增加

分布式数据库需要为大多数场景提供能够透明使用的能力,也要为少数性能要求高的场景提供手动调优消除分布式事务的能力。

这个观点的重要依据是,纯透明的模式本质上是使用分布式事务+全局索引来替代单机数据库中的事务+索引,而分布式事务+全局索引与单机事务+索引存在较大的性能差异。

本次测试将重点关注不同分布式数据库的索引性能,特别关注业内全局索引的性能与MySQL索引的性能差异。

本次测试的产品包括TiDB、OB、PolarDB-X、CockroachDB,选取这几个数据库有以下原因:

  1. 他们都提供了强一致的全局索引能力,是数据库而不是中间件。
  2. 都有开源,并且都有云产品提供,历史也都比较悠久,资料比较多,不是PPT数据库,容易搞清楚内部的原理。
  3. 都是主要面向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的角度看:

  1. 单机数据库由于事务的网络交互最少,RT表现的是最好的,并且跟索引的数量几乎没有关系。
  2. 分布式数据库的事务由于需要更多的跨节点交互,所以RT明显会比单机数据库更大。但由于分布式数据库在多分支的事务上一般都会采用并行写入的策略,因此表现好的数据库RT并不会随索引数量的增加而线性增加。总体说来,RT可以接受。
  3. CockroachDB全局索引的RT表现是最差的,可能跟事务策略使用HLC有关,其他几个数据库使用的都是TSO的方案。
  4. TiDB全局索引的RT表现的是最好的,0-8个索引RT几乎没有变化,说明并行优化做的非常好。
  5. 自家产品PolarDB-X全局索引的RT看起来还有优化的空间,虽然上涨有限,但并没有做到完全的并行。我们会在后续版本进行优化。本地索引RT非常稳定并且低。
  6. 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>=2
OB全局索引如果在建表语句中直接指定,似乎不支持指定分区数,因此全局索引需要使用单独的CREATE INDEX语句来创建
OB分区表的AUTO_INCREMENT属性似乎有严重的性能问题,设置了之后,性能很低,要去掉该属性,并且将sysbench的auto_inc设为off,由sysbench来生成主键值
OB默认使用的时间服务是本地时间服务(LTS),这种模式下是不支持全局索引的,需要手动修改为全局时间服务(GTS):

SET GLOBAL ob_timestamp_service='GTS';

测试结果

全局索引:

本地索引:

TiDB

环境配置

版本:6.1.0 部署结构:

需要注意的点:

  1. TiDB中语法上没有“全局索引”这个词,但从原理角度看,TiDB任何一张表都是分布式表,任何一个二级索引都是全局索引,它没有单表的概念
  2. 不要使用AUTO_INCREMENT。TiDB中的AUTO_INCREMENT虽然是分段的,不保证自增连续,但拉长时间后依然是有一定时间序的,所以会导致热点。需要使用AUTO_RANDOM替换AUTO_INCREMENT。
  3. 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)
);

欢迎大家留言讨论。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EMQX + PolarDB-X 一站式 IoT 数据解决方案

本文整理自 EMQX 产品经理李国伟,在PolarDB开源社区中关于EMQX与PolarDB-X构建一站式IoT数据解决方案的分享。本篇内容主要分为四个部分: 1. IoT数据特性 2. EMQX介绍 3. EMQX与PolarDB-X集成 4. EMQXPolarDB-X方案DEMO 一、IoT数据特性 物联网应用场景…

阿里 Seata 新版本终于解决了 TCC 模式的幂等、悬挂和空回滚问题

大家好,我是君哥。 今天来聊一聊阿里巴巴 Seata 新版本(1.5.1)是怎么解决 TCC 模式下的幂等、悬挂和空回滚问题的。 TCC 回顾 TCC 模式是最经典的分布式事务解决方案,它将分布式事务分为两个阶段来执行,try 阶段对每…

10分钟部署一个别人可以访问的在线网站(文末有礼

你是否幻想过拥有自己的个人网站?但是不会编程,没有任何网站搭建经验,搭建的时候也不知道怎么去选择系统…… 等等这一系列疑惑让大部分人还没开始就选择放弃,本期教大家用一个最简单的方式,在10分钟内搭建一个线上的…

菜鸟 CPaaS 平台微服务治理实践

背景 CPaaS(cainiao platform as a service)是以公有云为基座,结合先进的云原生理建设的企业级 DevOps 的 PaaS 平台,CPaaS 主要目前主要支持的场景:菜鸟生态的云上研发运维、菜鸟公有云 SaaS 化的能力透出、菜鸟商业…

RocketMQ 消息集成:多类型业务消息-普通消息

引言 Apache RocketMQ 诞生至今,历经十余年大规模业务稳定性打磨,服务了 100% 阿里集团内部业务以及阿里云数以万计的企业客户。作为金融级可靠的业务消息方案,RocketMQ 从创建之初就一直专注于业务集成领域的异步通信能力构建。本篇将从业务…

【总结】字符串匹配: KMP 和 拓展KMP

比起ac自动机,kmp就一个next数组,理解了如何初始化next后就可以搞一些模板题了,下面是还不错的学习资料,清晰易懂,自己用的模板也来自它: http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/ kmp模板 next[0]-1;j-1; for(i0;i<m;) {while(j>…

最小生成树(普利姆算法、克鲁斯卡尔算法)

给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 求最小生成树的算法 (1) 克鲁斯卡尔算法 图的存贮结构采用边集数组,且权值相等的边在数组中排列次序可以是任意的.该方法对于边相对比较多的不是很实用,浪费时间. (2) 普里姆算法 图…

《数字化与碳中和(园区篇)》报告正式发布,助力加快推进国家“双碳”战略实施

2021年10月&#xff0c;国务院印发《2030年前碳达峰行动方案》&#xff0c;明确提出要建设绿色低碳园区&#xff0c;并选择100个具有典型代表性的城市和园区开展碳达峰试点建设&#xff0c;在政策、资金、技术等方面对试点城市和园区给予支持。此后&#xff0c;碳达峰、碳中和正…

基于开放共享的自主研发—MaxCompute 持续增强生态与开放性建设

MaxCompute产品与生态架构 MaxCompute是一个具有先进架构的Serverless云数据仓库&#xff0c;自从商业化后&#xff0c;使用的用户涉及各个行业的头部客户。在生态上需要支持主流的开源产品以及阿里云云产品。其主要包括以下几个方面&#xff1a; 数据接入生态。目前官方提供…

构建数据中台的组织架构

一、中台是一种企业架构 1.TOGAF企业架构标准 TOGAF是一套企业架构标准。企业架构是指整个公司或企业的软件和其他技术的整体观点和方法。企业架构又细分为业务架构、应用架构、数据架构、技术架构几个方向。 其中业务架构的定义是“定义业务战略和组织&#xff0c;关键业务…

源于加速,不止加速——10年沉淀,破局改变

20余年技术&#xff0c;面临破局。CDN(Content Delivery Network&#xff0c;内容分发网络) 是一个超大规模的分布式系统&#xff0c;为互联网各类App和Web站点提供动 / 静态内容、实时流媒体加速以及网络安全防护等能力。在线购物、直播、音乐、游戏、社交等等一切&#xff0c…

5分钟让你在大火的多模态领域权威榜单VQA上超越人类

ModelScope上开源了达摩院众多业界最强多模态模型&#xff0c;其中就有首超人类的多模态预训练视觉问答模型mPLUG&#xff0c;小编激动的搓搓小手&#xff0c;迫不及待的体验了一下。 一探&#xff1a;浅草才能没马蹄 市面上有好多号称“用户上手简单”&#xff0c;“一步到位…

私有化输出的服务网格我们是这样做的

介绍 微服务开发的问题 微服务架构下我们在开发中遇到的常见的问题有以下 4 个&#xff1a; 多语言问题&#xff1a;有多种编程语言&#xff0c;node.js, JAVA, GoLang…微服务需要为每种语言都维护一种中间件 SDK升级推动难&#xff1a;SDK 升级需要推动业务应用进行代码修…

技术解读:Dragonfly 基于 P2P 的智能镜像加速系统

背景 网络下载 提起网络下载领域&#xff0c;你应该首先会想到基于 TCP/IP 协议簇的 C/S 模式。这种模式希望每一个客户机都与服务器建立 TCP 连接&#xff0c;服务器轮询监听 TCP 连接并依次响应&#xff0c;如下图&#xff1a; 上世纪末期&#xff0c;基于 C/S 模式的思想&…

Kruise Rollout:灵活可插拔的渐进式发布框架

前言 Kruise Rollout 是 OpenKruise 社区开源的渐进式交付框架。Kruise Rollout 支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布&#xff0c;以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停&#xff0c;并提供旁路的无感对接、兼容已有的多…

最小生成树的Prime算法的思想

Prime算法的核心步骤是&#xff1a;在带权连通图中V是包含所有顶点的集合&#xff0c; U已经在最小生成树中的节点&#xff0c;从图中任意某一顶点v开始&#xff0c;此时集合U{v}&#xff0c;重复执行下述操作&#xff1a;在所有u∈U,w∈V-U的边(u,w)∈E中找到一条权值最小的边…

一线技术人应该关注的四种思维能力

引言 作为长期奋战在一线的技术人&#xff0c;我深刻体会到如下几个思维能力对技术人成长的重要性&#xff0c;熟练运用这几种思维可以帮助我们快速的进入到新的领域&#xff0c;在分析、定位和解决问题上有很大帮助。 抽象思维&#xff1a;帮助我们快速抽取面对问题的关键要素…

Nacos 企业版如何提升读写性能和可观测性

概述 微服务引擎 MSE 发布 2.0.4.0 版本&#xff0c;新版本主要在性能和可观测能力升大幅提升&#xff0c;也加固了安全性。性能方面&#xff0c;基于 Dragonwell 进行构建&#xff0c;服务发现和配置性能提升达 40%以上&#xff1b;可观测方面&#xff0c;提供了服务注册的轨…

「技术人生」第9篇:如何设定业务目标

写在前面 上一篇文章讲了如何构建业务大图&#xff0c;看到有评论说这和设定 OKR 差不多啊。希望其他读者不要被类似的看法带偏。业务大图是业务顶层设计&#xff0c;是战略目标、业务长期价值、业务维度拆分、业务组织设计、业务长期发展方向、关键业务战役、短期重点事项的综…

我们总结了 3 大使用建议,并首次公开 Nacos3.0 规划图

Nacos 是什么 Nacos 是 Dynamic Naming and Configuration-Service 的首字母简称&#xff0c;定位于一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。从 2018 年 7 月开始宣布开源以来&#xff0c;已经走过了第四个年头&#xff0c;在这四年里&#xff0c;备…