暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

pg-duplicate-key-checker(PostgreSQL下配置对比)工具简介

SmallDB 2025-05-19
0

 

总结

最近的工作需要升级数据库,特别是使用工具迁移数据库,我个人认为一致性是第一位的,可是工具在迁移的时候,会自身为了加速运行会偷偷摸摸建立很多索引,因此要对比索引是否建立多了,是否重复了,业务上已经有了,是不是就不用建立了,整理之后开源出来,方便大家使用

工具

pg-duplicate-key-checker工具思路来源于是Percona Toolkit工具集的其中一个(pt-duplicate-key-checker),主要用于读取数据库表及索引对比,因PostgreSQL的特殊性,实现方法上还是有点不同的,
pg-duplicate-key-checker目前主要读取数据库pg_class/pg_index/pg_namespace/pg_attribute视图排除主键号唯一索引(这两个索引是确定了业务的唯一性)可以不用关注
主要是使用到的算法

  1. 1. 前缀匹配
  2. 2. 排序
  3. 3. 长度比较

案例讲解

人工

某一个表的索引是这个样子(排除唯一索引与主键)

字段名
索引名
field1,field2
idx_field1_field2
field2,field3,field4
idx_field2_field3_field4
field1,field2,field3
idx_field1_field2_field3_1
field2,field4
idx_field2_field4
field1,field2,field3
idx_field1_field2_field3
field1,field2,field3,field4
idx_field1_field2_field3_field4_1
field1
idx_field1
经过我们人手查看最终的效果是不是如下这个样子

字段名
索引名
field2,field4
idx_field2_field4
field2,field3,field4
idx_field2_field3_field4
field1,field2,field3,field4
idx_field1_field2_field3_field4_1
那我们的程序应该是什么样子呢?我们思考三秒中,如果是你,你如何写这个程序

程序

第一步排序,有没有发现问题呢,删除前面三个就可以了

字段名
索引名
field1
idx_field1
field1,field2
idx_field1_field2
field1,field2,field3
idx_field1_field2_field3_1
field1,field2,field3
idx_field1_field2_field3
field1,field2,field3,field4
idx_field1_field2_field3_field4_1
field2,field3,field4
idx_field2_field3_field4
field2,field4
idx_field2_field4
第二步,前缀匹配也可以叫做最长匹配(长度比较)

字段名
索引名
field1,field2,field3,field4
idx_field1_field2_field3_field4_1
field2,field3,field4
idx_field2_field3_field4
field2,field4
idx_field2_field4
第三步,打印多余索引并提示用户是否要删除(程序不负责删除需要人工审核一下)

多余字段名
多余索引名
SQL语句
field1
idx_field1
drop index idx_field1
field1,field2
idx_field1_field2
drop index idx_field1_field2
field1,field2,field3
idx_field1_field2_field3_1
drop index idx_field1_field2_field3_1
field1,field2,field3
idx_field1_field2_field3
drop index idx_field1_field2_field3

程序核心逻辑

for (size_t i = 0; i < data.size(); ++i) {
    bool isRedundantRow = false;
    for (size_t j = 0; j < data.size(); ++j) {
        if (i != j && isRedundant(data[i], data[j])) {
            isRedundantRow = true;
            break;
        }
    }
    if (!isRedundantRow && find(result.begin(), result.end(), data[i]) == result.end()) {
        result.push_back(data[i]);
    }
}

 


文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论