许中清的 PostgreSQL 表分区实践分享,真的是个不错的干货,尤其适合做数据量比较大的系统的你去参考一下。原生分区,讲得蛮细的,像是怎么用RANGE
分区、怎么给日志表按时间字段做拆分,还顺手贴了完整的 SQL 代码。对于经常要搞时间序列数据的你来说,分区这种事儿不光能提高查询性能,维护起来也轻松多了。
许中清的分享内容里,PostgreSQL 的原生分区得挺全:PARTITION BY RANGE
配上VALUES LESS THAN
,你就可以像切蛋糕一样按时间段分成多个表,比如 p1
到 p4
,后面那个还是MAXVALUE
兜底用的,设计思路挺实用。
分区表的好处嘛,主要是提升查询效率和数据维护的便利。你插入数据的时候,PostgreSQL 能根据规则把数据扔到对应的分区里,查询时也只扫命中的那几个分区。举个例子,如果你在查 2023 年的日志,那就只查对应的分区,响应也快,资源也省。
内容里还提了继承分区的做法,比如建一个parent
表,让child1
和child2
去继承结构,这样你在父表插入时能统一入口,查询时又能精准命中子表,组合起来灵活度也蛮高的。
哦对了,维护分区也是重点,像加约束、建触发器都讲了。比如创建一个router_to_2013
的触发器,把 2013 年的数据自动导进op_log_2013
,这操作思路也适合搞自动化归档啥的。
如果你项目里有日志、订单、设备数据这类按时间增长的表,强烈建议看看这个内容,顺手再翻翻相关文章也不错:PostgreSQL 表分区技术详解、MySQL 表分区啥的,扩展下眼界。
提醒一下,分区虽然好用,但别一股脑分太多,建议定期清理老数据,配合命令更新统计信息,才能让查询计划命中得更准。
如果你正愁大表太慢、日志表太肥,可以先照着这个思路搞一套试试,效果一般都还不错。