博客
关于我
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中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>