博客
关于我
PostgreSQL索引膨胀
阅读量:558 次
发布时间:2019-03-09

本文共 892 字,大约阅读时间需要 2 分钟。

数据库中索引膨胀问题在各大数据库中均存在,包括PostgreSQL。这种现象的根本原因往往与索引结构和数据插入顺序有关。

传统观点认为,索引膨胀是由于数据随机乱序写入所致。由于索引页面中的数据需要按序存储,随机插入会导致索引页频繁分裂,进而使得索引页面无法保持完全 packed(紧凑),最终引发索引膨胀。这种情况在PostgreSQL的btree、gin、gist等索引类型中同样会出现。

以btree索引为例:

  • 首先创建索引,再进行随机乱序数据插入时,索引大小会达到284MB。

  • 先按序插入数据再创建索引,索引大小则减小至214MB。这种差异的原因是,相比随机插入有序插入能更好地利用索引页面格局,减少索引分裂,进而降低索引膨胀的概率。

  • 若先插入数据再创建索引,索引大小也会维持在214MB。与随机插入对比,第一种做法反而会导致索引膨胀。最初的创建操作会将所有数据放入一个树的高度节点中,这种结构在随后随机插入时会经历严重的分裂结果,导致索引膨胀的发生。

  • 通过上述对比可以看出,顺序写入数据不会导致索引膨胀。索引膨胀的产生更多依赖于数据随机插入的方式以及索引树的构建顺序。

    Gin、gist等其他类型的索引也会面临类似的膨胀挑战。这就要求在出现索引膨胀时,必须对其进行重建以确保索引效率和性能。

    在PostgreSQL中,进行索引重建是支持的。重建索引的常规方法包含在同一列中创建新的索引,同时更新旧索引。另外,PostgreSQL还支持通过设置CONCURRENTLY参数对索引进行并行重建。这种机制可以避免在数据解析时出现较大的阻塞问题。具体操作如下:

    CREATE INDEX idx_t_idx ON t_idx (id) USING btree;\di+ idx_t_idx

    或者通过以下命令进行并行重建索引:

    CREATE INDEX CONCURRENTLY idx_t_idx ON t_idx (id) USING btree;

    并行处理可以显著减少索引重建对业务操作的影响,提升系统整体性能。这种方式既保证了索引维护的必要性,又最大化地降低了对在线操作的干扰。

    转载地址:http://yfcpz.baihongyu.com/

    你可能感兴趣的文章
    mysql 内连接、自然连接、外连接的区别
    查看>>
    mysql 写入慢优化
    查看>>
    mysql 分组统计SQL语句
    查看>>
    Mysql 分页
    查看>>
    Mysql 分页语句 Limit原理
    查看>>
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    MySQL 加锁处理分析
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 参数 innodb_flush_log_at_trx_commit
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    MySQL 命令和内置函数
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 在并发场景下的问题及解决思路
    查看>>
    MySQL 基础架构
    查看>>