发布于 2018

  • PgSQL中的触发器

    2018-07-07 @ 开发

    概览 触发器行为概述 触发器的分类 触发器的功能 触发器的种类 触发器的触发 触发器的创建 触发器的修改 触发器的查询 触发器的性能 触发器概述 触发器行为概述:英文,中文 触发器分类 触发时机:BEFORE, AFTER, INSTEAD 触发事件:INSERT, UPDATE, DELETE,TRUNCATE 触发范围:语句级,行级 内部创建:用于约束的触发器,用户定义的触发器 触发模式:origin|local(O), replica(R),disable(D) 触发器操作 触发器的操 …

    更多

  • IP地理逆查询优化

    2018-07-07 @ 开发

    IP归属地查询的高效实现 ​ 在应用开发中,一个‘很常见’的需求就是GeoIP转换。将请求的来源IP转换为相应的地理坐标,或者行政区划(国家-省-市-县-乡-镇)。这种功能有很多用途,譬如分析网站流量的地理来源,或者干一些坏事。使用PostgreSQL可以多快好省,优雅高效地实现这一需求。 0x01 思路方法 ​ 通常网上的IP地理数据库的形式都是:start_ip, stop_ip , longitude, latitude,再缀上一些国家代码,城市代码,邮编之类的属性字段。大概长这样: …

    更多

  • 理解字符编码

    2018-07-01 @ 开发

    ​ 程序员,是与Code(代码/编码)打交道的,而字符编码又是最为基础的编码。 如何使用二进制数来表示字符,这个字符编码问题并没有看上去那么简单,实际上它的复杂程度远超一般人的想象:输入、比较排序与搜索、反转、换行与分词、大小写、区域设置,控制字符,组合字符与规范化,排序规则,处理不同语言中的特异需求,变长编码,字节序与BOM,Surrogate,历史兼容性,正则表达式兼容性,微妙与严重的安全问题等等等等。 ​ 如果不了解字符编码的基本原理,即使只是简单常规的字符串比较、排序、随机访问操作,都可 …

    更多

  • PgSQL开发规约

    2018-06-20 @ 文章

    0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑。 你好我也好,大家都好。 0x01 命名规范 无名,万物之始,有名,万物之母。 【强制】 通用命名规则 本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等。 对象名务必只使用小写字 …

    更多

  • PG好处都有啥

    2018-06-10 @ 文章

    PostgreSQL的Slogan是“世界上最先进的开源关系型数据库”,但我觉得这口号不够响亮,而且一看就是在怼MySQL那个“世界上最流行的开源关系型数据库”的口号,有碰瓷之嫌。要我说最能生动体现PG特色的口号应该是:一专多长的全栈数据库,一招鲜吃遍天嘛。 全栈数据库 ​ 成熟的应用可能会用到许许多多的数据组件(功能):缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。传统的架构选型呢,可能会组合使用多 …

    更多

  • 并发异常那些事

    2018-06-09 @ 开发

    并发异常那些事 并发程序很难写对,更难写好。很多程序员也没有真正弄清楚这些问题,不过是一股脑地把这些问题丢给数据库而已。并发异常并不仅仅是一个理论问题:这些异常曾经造成过很多资金损失,耗费过大量财务审计人员的心血。但即使是最流行、最强大的关系型数据库(通常被认为是“ACID”数据库),也会使用弱隔离级别,所以它们也不一定能防止这些并发异常的发生。 ​ 比起盲目地依赖工具,我们应该对存在的并发问题的种类,以及如何防止这些问题有深入的理解。 本文将阐述SQL92标准中定义的隔离级别及其缺陷,现代模型 …

    更多

  • 区块链与分布式数据库

    2018-06-09 @ 文章

    区块链的本质,想提供的功能,及其演化方向,就是分布式数据库。 确切的讲,是拜占庭容错(抗恶意节点攻击)的分布式(无领导者复制)数据库。 如果这种分布式数据库用来存储各种币的交易记录,这个系统就叫做所谓的“XX币”。例如以太坊就是这样一个分布式数据库,上面除了记载着各种山寨币的交易记录,还可以记载各种奇奇怪怪的内容。花一点以太币,就可以在这个分布式数据库里留下一条记录(一封信)。而所谓智能合约就是这个分布式数据库上的存储过程。 从形式上看,区块链与**预写式日志(Write-Ahead-Log, …

    更多

  • 行政区划归属查询

    2018-06-06 @ 开发

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

    更多

  • KNN极致优化

    2018-06-06 @ 开发

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

    更多

  • 监控PG中的表大小

    2018-05-14 @ 管理

    表的空间布局 宽泛意义上的表(Table),包含了本体表与TOAST表两个部分: 本体表,存储关系本身的数据,即狭义的关系,relkind='r'。 TOAST表,与本体表一一对应,存储过大的字段,relinkd='t'。 而每个表,又由主体与索引两个**关系(Relation)**组成(对本体表而言,可以没有索引关系) 主体关系:存储元组。 索引关系:存储索引元组。 每个关系又可能会有四种分支: main: 关系的主文件,编号为0 fsm:保存关于main分支中空闲空间的信息, …

    更多