当前位置: 首页 > news >正文

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

为什么要做这个测试

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

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

1.以TiDB、CockroachDB等为代表的纯透明的用法。从表现上来看,该种类型的数据库所有表都是分布式表,并且不需要指定分区键,其核心逻辑是使用分布式事务来维护全局索引,并使用全局索引完全替代单机数据库中的二级索引。

2.以OceanBase等为代表的纯手动的用法。从表现上看,该种类型的数据库在不指定分区键的情况下,是以单表的形式存在的,不具备扩展性;创建分布式表需要使用类似分区表的语法。此类型的数据库一般也提供全局索引的能力(不提供的我们一般称之为中间件而不是数据库)。但与第一类不同,它们一般会将全局索引作为一个可选项,由用户手动的指定与创建。此外,他们还会提供基于单机事务实现的本地索引(Local Index)。

3.同时提供以上两种用法的PolarDB-X。在不指定分区键的情况下,与第一类数据库类似,使用分布式表+全局索引来提供透明的分布式体验;也允许手动指定分区键,使用本地索引等技术提升性能。

在之前的文章中 ,我们提出:

1.透明(自动)的易用性决定了分布式数据库的使用下限,但性能并不是最优的,有更高的成本代价

2.手动能够提供最优的性能,但使用门槛会有所增加

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

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

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

本次测试的产品包括TiDB、OceanBase、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,独享型 阿里云购买:

测试结果

索引数量RT(单线程)最高TPSTPS比例
00.5237599100%
10.533586095%
20.633485993%
40.623333889%
80.583163684%

OceanBase

环境配置

版本:社区版 3.1.4

组件机器
OB Server
OB Proxy
6台机器,分成了3个zone,每个zone两个UNIT。每台机器各部一个OB Server和一个OB Proxy

租户配置:

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') ;

需要注意的几点:

  1. OB中的表默认为单表(只分布在一个节点上),需要使用分区表的语法,指定分区键与分区数,才能成为一张分布式表
  2. OB默认的索引是本地索引,需要指定Global关键字才是全局索引
  3. OB的全局索引默认也是一个单表(只有一个分区,只分布在一个节点上),需要手动指定分区数才是一个真正的分布式索引
  4. UNIT_NUM=1的情况下,似乎即使是分区表,也都在同一台机器上,所以测试机器数要>=6,确保UNIT_NUM>=2
  5. OB全局索引如果在建表语句中直接指定,似乎不支持指定分区数,因此全局索引需要使用单独的CREATE INDEX语句来创建
  6. OB分区表的AUTO_INCREMENT属性似乎有严重的性能问题,设置了之后,性能很低,要去掉该属性,并且将sysbench的auto_inc设为off,由sysbench来生成主键值
  7. OB默认使用的时间服务是本地时间服务(LTS),这种模式下是不支持全局索引的,需要手动修改为全局时间服务(GTS):
SET GLOBAL ob_timestamp_service='GTS';

测试结果

全局索引:

索引数量RT(单线程)最高TPSTPS比例
01.4072298100%
12.561854826%
22.811310518%
43.38913013%
83.9159408%

本地索引:

索引数量RT(单线程)最高TPSTPS比例
01.4072298100%
11.416383288%
21.376288686%
41.456122685%
81.475639978%

TiDB

环境配置

版本:6.1.0 部署结构:

组件机器
TiDB5台,每台机器一个TiDB进程,一个TiKV进程
TiKV
PD3台

需要注意的点:

  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语法的表上创建的索引,在功能上也叫本地索引。

测试结果

全局索引:

索引数量RT(单线程)最高TPSTPS比例
01.44105112.07100%
11.6531876.1130%
21.6721631.2820%
41.7314045.0313%
81.858138.608%

本地索引:

索引数量RT(单线程)最高TPSTPS比例
01.77105521.21100%
11.6849534.1947%
21.8136861.7835%
41.8824788.6423%
82.0215776.3015%

CockroachDB

环境配置

版本:22.1.6

组件机器
CockroachDB6台,每台机器一个CockroachDB进程

CDB与TiDB的架构是类似的,表构建于分布式KV之上,所有表都是分布式表,所有索引都是全局索引,没有单表的概念。

需要注意的点:

  1. 在CDB中,使用Serial类型主键(类似mysql中的auto_increment),或者使用unique_rowid()作为主键,因为这两个都是有一定时间序的,都会产生显著的热点,几乎无法使用。测试中使用UUID类型的列,并使用 gen_random_uuid()生成主键。这个本质是一个字符串,在KV层range的划分上可以认为是无序的。
  2. CDB每个连接的代价比较高,无法创建太多的连接

测试结果

全局索引:

索引数量RT(单线程)最高TPSTPS比例
02.7586094100%
12.811361816%
22.811144013%
43.41960211%
85.8374249%

PolarDB-X

环境配置

规格:公有云8C32G*2 版本:5.4.13 注意:

  1. 建库时需要使用mode=auto,这种类型的数据库表不指定分区键的情况下是分布式表,同时索引是全局索引。
  2. 索引前加Local关键字可以只创建本地索引

测试结果

全局索引:

索引数量RT(单线程)最高TPSTPS比例
01.0671644.05100%
12.2220045.7828%
22.2513746.9719%
43.0710683.9915%
83.678098.4411%

本地索引:

索引数量RT(单线程)最高TPSTPS比例
01.0671644.05100%
11.3469690.6097%
21.3567346.6694%
41.4764353.6390%
81.558782.9482%

附录

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)
);


云原生数据库PolarDB分布式版新增标准版形态,基于X-Paxos提供100%兼容MySQL的高可靠性集中式数据库服务。
阿里巴巴集团双十一同款数据库,即刻拥有:

PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评 - 知乎 (zhihu.com)

相关文章:

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

为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中,从使用体验的角度看…...

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差,不利于在不同规模的数据集上有效运行若输入维度发生变化,需要修改并重新训练网络容易过拟合 全连接导致参数量特别多,容易过拟合如果增加更多层,参数量会翻倍无法有效利用局部特征 输入…...

鸿蒙开发基本概念

1、开发准备 1.1、UI框架 HarmonyOS提供了一套UI开发框架,即方舟开发框架(ArkUI框架)。方舟开发框架可为开发者提供应用UI开发所必需的能力,比如多种组件、布局计算、动画能力、UI交互、绘制等。 方舟开发框架针对不同目的和技术…...

Open CV 图像处理基础:(二)从基本概念到实践操作

Open CV 图像处理基础:从基本概念到实践操作 一、引言 图像处理是计算机视觉领域的一个重要分支,它涉及对图像的各种操作和处理。了解图像的基本概念、读取和显示方法以及基本操作是图像处理的基础。本文将通过示例文章的形式,帮助初学者逐…...

【MAC】M2 安装docker 与 mysql

一、docker下载地址 下载地址 二、安装docker完成 罗列一下docker常用命令 # 查看docker版本 docker --version# 拉取镜像 docker pull 镜像名# 查看当前所有镜像 docker images# 查看运行中的容器 docker ps -a docker ps grep| 镜像名#镜像启动操作: sudo dock…...

轻量级web开发框架Flask本地部署及无公网ip远程访问界面

文章目录 前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何在本地安装Flask,以及如何将其web界面发布到公网上并进行远程访问。 Flask是目前十分流行的web框架,采用P…...

用最通俗的语言讲解 TCP “三次握手,四次挥手”

目录 一. 前言 二. TCP 报文的头部结构 三. 三次握手 3.1. 三次握手过程 3.2. 为什么要三次握手 四. 四次挥手 4.1. 四次挥手过程 4.2. 为什么要四次挥手 五. 大白话说 5.1. 大白话说三次握手 5.2. 大白话说四次挥手 六. 总结 一. 前言 TCP 是一种面向连接的、可靠…...

使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis

1.背景 生产环境,某云的某个业务Redis实例,触发内存使用率,连续 3 次 平均值 > 85 %告警。 运维同学告知,看看需要怎么优化或者升级配置?分享了其实例RDB的内存剖析链接。 通过内存剖析详情发现,存在某…...

机器视觉:AI赋能缺陷检测,铸就芯片产品的大算力与高能效

导言:近年来,国内芯片行业快速发展,市场对芯片需求的不断增大,芯片的缺陷检测压力也越来越大。芯片产品在生产制造过程中,需要经历数道工序,每个生产环节的材料、环境、工艺参数等都有可能造成产品缺陷。不…...

(9)Linux Git的介绍以及缓冲区

💭 前言 本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 "进度条" 小程序。最后我们来介绍一下 Git,着重讲解一下 Git 三板斧,一般只要掌握三板斧就基本够用了。 缓冲区&#xff…...

华为云之ECS云产品快速入门

华为云之ECS云产品快速入门 一、ECS云服务器介绍二、本次实践目标三、创建虚拟私有云VPC1.虚拟私有云VPC介绍2.进入虚拟私有云VPC管理页面3.创建虚拟私有云4.查看创建的VPC 四、创建弹性云服务器ECS——Linux1.进入ECS购买界面2.创建弹性云服务器(Linux)——基础配置步骤3.创建…...

tcp 的限制 (TCP_WRAPPERS)

#江南的江 #每日鸡汤:青春是打开了就合不上的书,人生是踏上了就回不了头的路,爱情是扔出了就收不回的赌注。 #初心和目标:拿到高级网络工程师 TCP_WRAPPERs Tcp_wrappers 对于七层模型中是位于第四层的安全工具,他…...

如何保证架构的质量

1. 如何保证架构的质量: ①. 稳定性、健壮性(1). 系统稳定性: ①. 定义:a. 当一个实际的系统处于一个平衡的状态时,如果受到外来作用的影响时,系统经过一个过渡过程仍然能够回到原来的平衡状态.b. 可以说这个系统是稳定的,否则系统不稳定c. 如一根绳子绑着小球,处于垂直状态,…...

JavaWeb笔记之前端开发JavaScript

一、引言 1.1 简介 JavaScript一种解释性脚本语言,是一种动态类型、弱类型、基于原型继承的语言,内置支持类型。 它的解释器被称为JavaScript引擎,作为浏览器的一部分,广泛用于客户端的脚本语言,用来给HTML网页增加…...

SCAU:18063 圈中的游戏

18063 圈中的游戏 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有n个人围成一圈,从第1个人开始报数1、2、3,每报到3的人退出圈子。编程使用链表找出最后留下的人。输入格式 输入一个数n&a…...

.NET Core中鉴权 Authentication Authorization

Authentication: 鉴定身份信息,例如用户有没有登录,用户基本信息 Authorization: 判定用户有没有权限 使用框架提供的Cookie鉴权方式 1.首先在服务容器注入鉴权服务和Cookie服务支持 services.AddAuthentication(options > {options.DefaultAuthe…...

PyTorch深度学习实战(26)——卷积自编码器(Convolutional Autoencoder)

PyTorch深度学习实战(26)——卷积自编码器 0. 前言1. 卷积自编码器2. 使用 t-SNE 对相似图像进行分组小结系列链接 0. 前言 我们已经学习了自编码器 (AutoEncoder) 的原理,并使用 PyTorch 搭建了全连接自编码器,但我们使用的数据…...

Milvus实战:构建QA系统及推荐系统

Milvus简介 全民AI的时代已经在趋势之中,各类应用层出不穷,而想要构建一个完善的AI应用/系统,底层存储是不可缺少的一个组件。 与传统数据库或大数据存储不同的是,这种场景下则需要选择向量数据库,是专门用来存储和查…...

使用Docker部署Nexus Maven私有仓库并结合Cpolar实现远程访问

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具,用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关,可…...

GEE-Sentinel-2月度时间序列数据合成并导出

系列文章目录 第一章:时间序列数据合成 文章目录 系列文章目录前言时间序列数据合成总结 前言 利用每个月可获取植被指数数据取均值,合成月度平均植被指数,然后将12个月中的数据合成一个12波段的时间数据合成数据。 时间序列数据合成 代码…...

【深度学习】语言模型与注意力机制以及Bert实战指引之二

文章目录 前言 前言 这一篇是bert实战的完结篇,准备中。...

计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签

文章目录 5 IPv65.1 组成5.2 IPv6地址5.3 从IPv4向IPv6过渡5.3.1 双协议栈5.3.2 隧道技术 6 因特网的路由选择协议6.1 内部网关协议RIP6.2 内部网关协议 OSPF基本特点 6.3 外部网关协议 BGP6.3.1 路由选择 6.4 路由器组成6.4.1 基本了解6.4.2 结构 7 IP多播7.1 硬件多播7.2 IP多…...

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用 引言 在前面几期,介绍了敏感性分析法,本期来介绍lstm作为代理模型的sobol全局敏感性分析模型。 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代…...

求奇数的和 C语言xdoj147

题目描述:计算给定一组整数中奇数的和,直到遇到0时结束。 输入格式:共一行,输入一组整数,以空格分隔 输出格式:输出一个整数 示例: 输入:1 2 3 4 5 0 6 7 输出:9 #inclu…...

全链路压力测试:解析其主要特点

随着信息技术的飞速发展和云计算的普及,全链路压力测试作为一种关键的质量保障手段,在软件开发和系统部署中扮演着至关重要的角色。全链路压力测试以模拟真实生产环境的压力和负载,对整个业务流程进行全面测试,具有以下主要特点&a…...

算法基础之约数个数

约数个数 核心思想&#xff1a; 用哈希表存每个质因数的指数 然后套公式 #include <iostream>#include <algorithm>#include <unordered_map>#include <vector>using namespace std;const int N 110 , mod 1e9 7;typedef long long LL; //long l…...

【ECharts】折线图

文章目录 折线图1折线图2折线图3示例 参考&#xff1a; Echarts官网 Echarts 配置项 折线图1 带X轴、Y轴标记线&#xff0c;其中X轴是’category’ 类目轴&#xff0c;适用于离散的类目数据。 let myChart echarts.init(this.$refs.line_chart2); let yList [400, 500, 6…...

java jdbc连接池

什么是连接池&#xff1a; Java JDBC连接池是一个管理和分配数据库连接的工具。在Java应用程序中&#xff0c;连接到数据库是一个耗时且资源密集的操作&#xff0c;而连接池可以通过创建一组预先初始化的数据库连接&#xff0c;然后将其保持在连接池中&#xff0c;并按需分配给…...

unity2d 关闭全局重力

UNITY2D项目默认存在Y轴方向重力&#xff0c;创建俯视角2D场景时可通过以下配置关闭 Edit > Project Settings > Physics 2D > General Settings > Gravity 设置Y0...

大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”

云布道师 2023 年 10 月 31 日-11 月 2 日&#xff0c;2023 云栖大会在中国杭州云栖小镇举行&#xff0c;阿里云弹性计算产品专家唐湘华、阿里云高级安全专家刘煜堃、蚂蚁集团高级技术专家肖俊贤三位嘉宾在【云服务器 & 计算服务】专场中共同带来题为《大数据时代&#xf…...

国外唯美flash个人网站欣赏/it培训机构怎么样

0.参考文献1.HashSet概述&#xff1a;HashSet实现Set接口&#xff0c;由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序&#xff1b;特别是它不保证该顺序恒久不变。此类允许使用null元素。HashSet中不允许有重复元素&#xff0c;这是因为HashSet是基于HashMap实…...

flash网站用什么做/网站快速排名的方法

http://www.swfdiy.com/?p842 AMF3 AS 3.0 ASP.NET 完整配置过程 啥是AMF AMF是Action Message Format的简写&#xff0c;它是一种二进制的数据格式&#xff0c; 它的设计&#xff0c;是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成 一段你…...

网站做app服务端/互联网推广渠道

转载于:https://www.cnblogs.com/luoyinjie/p/10683853.html...

企业搭建网站的必要性/广州seo优化推广

安静的早餐Scala学习手册(Learning Scala)第二章1、值与变量定义2、命名3、数据类型及其转换(toType)4、字符串和内插5、元组1、值与变量定义值的定义值&#xff0c;即为常量&#xff0c;不可变&#xff0c;基本语法定义&#xff1a;val : ​创建一个名为a&#xff0c;类型为I…...

网站开发 实习报告/steam交易链接在哪

第一、二轮&#xff0c;由于家里有急事&#xff0c;弃权。 第三轮 后手拿下一盘 第四轮 先手再拿下一盘 第五轮 9&#xff1a;30要汇报一个项目&#xff0c;推也推不掉&#xff0c;想早点把棋结束&#xff0c;只想走激烈的变化&#xff0c;输掉了。 第六轮&#xff0c;汇报去了…...

程序员自学网站/seo在线教学

BOOL CPrjDlg::PreTranslateMessage(MSG* pMsg){if ((pMsg->message WM_LBUTTONDOWN) || (pMsg->message WM_LBUTTONUP)) //核心点{if (GetFocus() GetDlgItem(IDC_EDIT_PRJ_NAME)) //根据不同控件焦点判断是那个在执行 {char chHelp[100]; GetPrivateProfileStrin…...