博客
关于我
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 CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    mutiplemap 总结
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>
    mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
    查看>>