目前我们有类型 4 UUID(random) 作为主键的表。我们的应用层会批量插入数据库。但是由于主键是随机的,这将导致多次磁盘旋转。有四张桌子。
CREATE TABLE process (
process_id binary(16) not null, // uuid
created_time bigint not null,
owner varchar(150) not null,
primary key (process_id),
index idx_c_t (created_time),
index idx_o (owner)
)
Records inserted = 2000/min
CREATE TABLE process_job (
job_id binary(16) not null, //uuid
process_id binary(16) not null, //uuid
info varchar(200),
text varchar(500),
primary key(job_id),
index idx_p_id (process_id)
)
Records inserted = 10000/min
CREATE TABLE ob_status (
job_id binary(16) not null, //uuid
status ('STARTED', 'SUCCESS', 'ERROR') not null,
job_code varchar(100) not null,
info varchar(200),
text varchar(500),
primary key(job_id, status, job_code)
)
Records inserted = 20000/min
CREATE TABLE process_job_custom (
job_id binary(16) not null, //uuid
key varchar(100) not null,
value varchar(500),
primary key(process_id, key)
)
Records inserted = 10000/min
我们所有的表格都使用 DYNAMIC 格式。
此外,我们会定期删除 15 天前的数据。我们通过考虑大约 1000 条记录分批运行此删除操作。但是当删除运行时,整个数据库的性能都很差。磁盘使用率非常高。(我们怀疑这是由于主键的随机性)
所以我们计划将我们的主键更改为(基于时间的键,uuid)并在(uuid)列上添加索引。
记录可能以随机顺序到达(不完全按照基于时间的密钥顺序)。但是基于时间的密钥的记录大多在 5 分钟内到达。我们的删除也是基于基于时间的键。
这会影响插入的性能吗?
此外,我们的主要用例涉及基于时间的查询。那么选择性能也会提高吗?
此外,我们计划按基于时间的键进行分区。
这会帮助我们提高整体性能吗?
我们怀疑主要问题是主键的随机性。
将基于时间的键(类似于进程的创建时间)添加为所有表中主键的第一部分,并且基于 uuid 列的索引对我们有帮助吗?