Posts in 2018
  • PostGIS高效解决行政区划归属查询

    2018年06月06日 in PG 开发

    微信公众号原文 在应用开发中,很多时候我们需要解决这样一个问题:根据用户的经纬度坐标,定位用户的行政区划。 我们收集到的是诸如28°00'00"N 100°00'00.000"E这样的经纬度坐标,但实际感兴趣的是这个点所属的行政区划:(中华人民共和国,云南省,迪庆藏族自治州,香格里拉市)。这种将地理坐标映射到某条记录的操作就称为地理编码(GeoEncode)。高效实现地理编码是一个很有趣的问题。 本文介绍了该问题的解决与优化方案:能在确保正确性的前提下,能用几兆的空 …

    Read more

  • KNN极致优化:从RDS到PostGIS

    2018年06月06日 in PG 开发

    灵活应用数据库的功能,可以轻松实现 GIS 圈选场景下三万倍的性能提升。 Level 方法 性能/耗时(ms) 可维护性/可靠性 备注 1 暴力扫表 30,000 - 形式简单 2 经纬索引 35 复杂度/魔数问题 额外复杂度 3 联合索引 10 复杂度/魔数问题 额外复杂度 4 GIST 4 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 5 btree_gist联合索引 1 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 场景 互联网中的很多业务都涉及 …

    Read more

  • 用 Exclude 实现互斥约束

    2018年04月06日 in PG 开发

    Exclude约束是一个PostgreSQL扩展,它可以实现一些更高级,更巧妙的的数据库约束。 前言 数据完整性是极其重要的,但由应用保证的数据完整性并不总是那么靠谱:人会犯傻,程序会出错。如果能通过数据库约束来强制数据完整性那是再好不过了:后端程序员不用再担心竞态条件导致的微妙错误,数据分析师也可以对数据质量充满信心,不需要验证与清洗。 关系型数据库通常会提供PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK约束,然而并不是所有的业务约束都可以用这几种约束表达。一些 …

    Read more

  • 函数易变性等级分类

    2018年04月06日 in PG 开发

    PgSQL中的函数默认有三种易变性等级,合理使用可以显著改善性能。 核心种差 VOLATILE : 有副作用,不可被优化。 STABLE: 执行了数据库查询。 IMMUTABLE : 纯函数,执行结果可能会在规划时被预求值并缓存。 什么时候用? VOLATILE : 有任何写入,有任何副作用,需要看到外部命令所做的变更,或者调用了任何VOLATILE的函数 STABLE: 有数据库查询,但没有写入,或者函数的结果依赖于配置参数(例如时区) IMMUTABLE : 纯函数。 具体解释 每个函数都带 …

    Read more

  • Distinct On 去除重复数据

    2018年04月06日 in PG 开发

    Distinct On是PostgreSQL提供的特有语法,可以高效解决一些典型查询问题,例如,快速找出分组内具有最大最小值的记录。 前言 找出分组内具有最大最小值的记录,这是一个非常常见的需求。用传统SQL当然有办法解决,但是都不够优雅,PostgreSQL的SQL扩展语法Distinct ON能一步到位解决这一类问题。 DISTINCT ON 语法 SELECT DISTINCT ON (expression [, expression ...]) select_list ... Here …

    Read more

Posts in 2017
  • GO与PG实现缓存同步

    2017年08月03日 in PG 开发

    Parallel与Hierarchy是架构设计的两大法宝,缓存是Hierarchy在IO领域的体现。单线程场景下缓存机制的实现可以简单到不可思议,但很难想象成熟的应用会只有一个实例。在使用缓存的同时引入并发,就不得不考虑一个问题:如何保证每个实例的缓存与底层数据副本的数据一致性(和实时性)。 PostgreSQL在版本9引入了流式复制,在版本10引入了逻辑复制,但这些都是针对PostgreSQL数据库而言的。如果希望PostgreSQL中某张表的部分数据与应用内存中的状态保持一致,我们还是需要自 …

    Read more

  • 用触发器审计数据变化

    2017年06月09日 in PG 开发

    有时候,我们希望记录一些重要的元数据变更,以便事后审计之用。 PostgreSQL的触发器就可以很方便地自动解决这一需求。 -- 创建一个审计专用schema,并废除所有非superuser的权限。 DROP SCHEMA IF EXISTS audit CASCADE; CREATE SCHEMA IF NOT EXISTS audit; REVOKE CREATE ON SCHEMA audit FROM PUBLIC; -- 审计表 CREATE TABLE …

    Read more

  • SQL实现ItemCF推荐系统

    2017年04月05日 in PG 开发

    推荐系统大家都熟悉,猜你喜欢,淘宝个性化什么的,前年双十一搞了个大新闻,还拿了CEO特别贡献奖。 今天就来说说怎么用PostgreSQL 5分钟实现一个最简单ItemCF推荐系统,以推荐系统最喜闻乐见的movielens数据集为例。 原理 ItemCF的原理可以看项亮的《推荐系统实战》,不过还是稍微提一下吧,了解的直接跳过就好。 Item CF,全称Item Collaboration Filter,即基于物品的协同过滤,是目前业界应用最多的推荐算法。ItemCF不需要物品与用户的标签、属性,只 …

    Read more

Posts in 2016
  • UUID性质原理与应用

    2016年11月06日 in PG 开发

    最近一个项目需要生成业务流水号,需求如下: ID必须是分布式生成的,不能依赖中心节点分配并保证全局唯一。 ID必须包含时间戳并尽量依时序递增。(方便阅读,提高索引效率) ID尽量散列。(分片,与HBase日志存储需要) 在造轮子之前,首先要看一下有没有现成的解决方案。 Serial 传统实践上业务流水号经常通过数据库自增序列或者发码服务来实现。 MySQL的Auto Increment,Postgres的Serial,或者Redis+lua写个小发码服务都是方便快捷的解决方案。这种方案可以保证全 …

    Read more