重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
sequence 是 pg 自带的高效的自增id工具(也叫序列)。sequence 使用了轻量级锁的方式来做到高效自增id的,所以会比 UPDATE 行锁快。sequence 的返回数据类型默认是64位的整数,pg 10 可以自定 smallint, integer 或者是 bigint。
成都创新互联公司专注于成都网站设计、成都网站制作、网页设计、网站制作、网站开发。公司秉持“客户至上,用心服务”的宗旨,从客户的利益和观点出发,让客户在网络营销中找到自己的驻足之地。尊重和关怀每一位客户,用严谨的态度对待客户,用专业的服务创造价值,成为客户值得信赖的朋友,为客户解除后顾之忧。
sequence 是可以保证自增数据不重复的,也就是说每次自增后都会持久化保存,那么为了继续提高性能,可以加上 CACHE 参数(默认为1),每个进程(连接)可以缓存一个子序列在当前进程内存里面,当子序列用完了才会去原序列取新的子序列。
这个用个例子简单说一下,创建 sequence temp_seq3 时用了 CACHE 10,A session 可以获取到的值是 1...10,B session 可以获取到的值是 11...20,那么获取顺序可能是 (A, A, B, A),返回值是 (1, 2, 11, 3),这个不是严格自增的序列,但可以保证回次返回都是唯一的,用了 CYCLE 参数的除外。
根据文档和源码( link 第80行),缓存在内存里面的最大值(cached)是每个进程都不一样的,所以如果要求严格自增的服务不能用 CACHE。
这里写三种用 pg 做自增id的方式
测试命令,在 MacOS 上用 docker 开一个 pg 在里面运行一下 pgbench 脚本,其中 sql.sql 的内容替换成对应的压测脚本。
TPS: 986
TPS: 7332
TPS: 7451
看看微信的分布式id生成器,原理都差不多,"实际应用中每次提升的步长为10000" = "CACHE 10000"。 link
以上优化已经是用在友好速搭电商系统的订单号和优惠券号生成服务中,为商家提供更快更可靠的服务。
从join的基本语法如下:
由此可以知道join的类型有以下几种类型:
假设有以下两张表
Table A:
Table B:
要说连接,首先要知道一个概念——笛卡尔积。
在PostgreSQL中笛卡尔积就是 cross join ,这是上面join类型中没有提到的。
结果如下:
简单来说,笛卡尔积就是把两张表所有的行拼起来。3行的表与3行的表连接,连接表就是9行。
内连接的 inner 是可以省略不写的。内连接会把满足连接条件的t_a和t_b的行连接起来,作为连接表的一行。
结果如下:
只有满足条件:id相等的列才会出现在连接表里。
首先会执行内连接,然后把左表的行都放进连接表,对于没有满足条件的右表的行,用空值代替
结果如下:
首先会执行内连接,然后把右表的行都放进连接表,对于没有满足条件的左表的行,用空值代替
结果如下:
首先会执行内连接,然后把左表和右表的行都放进连接表,对于没有满足条件的右表的行,用空值代替;对于没有满足条件的左表的行,用空值代替。
结果如下:
on 后面只要跟上返回布尔值的条件表达式即可,没有强制要求一定要使用表中的列,类似于where条件。
using函数需要传入左表和右表都存在的列名。以上面的例子来说,
using(id)
等价于
on t_a.id = t_b.id
可以传入多个列名,就相当于用and连接多个条件。需要注意的点是:
结果如下:
将natural join放在连接条件里而不是连接类型里面,主要是因为natural join是隐含的使用了using,并且参数是两张表中所有同名的列。
结果如下:
UUID(Universal Unique Identifier)或者 GUID(Globally Unique Identifier)是一个 128 比特的数字,可以用于唯一标识每个网络对象或资源。由于它的生成机制,一个 UUID 可以保证几乎不会与其他 UUID 重复,因此常常用于生成数据库中的主键值。
1.pgcrypto 模块提供的 uuid
PostgreSQL 提供了一个用于加/解密的扩展模块 pgcrypto,其中的 gen_random_uuid() 函数可以用于返回一个 version 4 的随机 UUID。
2.uuid-ossp 模块提供的 uuid
uuid-ossp模块提供函数使用几种标准算法之一产生通用唯一标识符(UUID)。还提供产生某些特殊 UUID 常量的函数。
1.将当前目录转移到 PostgreSQL 源代码目录下的 contrib;如:
2.执行如下命令来安装扩展模块
如果要安装 uuid-ossp 模块,需要在执行安装扩展模块之前,执行 configure 并添加 --with-uuid=xxx,xxx取值为:
然后再执行安装扩展模块的命令。
3.检查是否安装,在 PostgreSQL 的安装目录下的 /share/extension 目录下,查看是否有模块相关的文件。如:
注: gen_random_uuid() 从 PostgreSQL 13 开始成为了一个内置函数
如果您所使用的PostgreSQL版本在13以上,则不需要执行如下语句:
生成uuid:
如果想要生成没有中划线(-)的 UUID 字符串,可以使用 REPLACE 函数:
查看包含的函数:
执行如下命令生成 uuid:
序列数可以增加postgresql数据表的检索速度,同时降低数据查询时的资源消耗。那么如何在postgresql中创建序列数并且应用呢?下面我给大家分享一下。
工具/材料
pgAdmin4
创建序列数
首先打开pgAdmin4,展开postgresql数据库,找到模式下面的public选项,如下图所示
接下来在public下面右键单击序列,然后点击Create下面的sequence选项,如下图所示
在弹出的创建Sequence界面中首先给序列数起一个名字,如下图所示,注意都用英文
然后切换到Definition页卡,定义一下序列的增加量,如下图所示,其中maximum根据自己的需要进行设置
最后回到数据库主界面,你会看到序列下面多出了一个项,这就是我们创建的序列数了,如下图所示
在数据表中应用序列数
首先选中一个数据表,点击右侧的编辑按钮,如下图所示
在弹出的编辑界面中切换到Columns页卡,点击ID签名的编辑按钮,如下图所示
最后在字段的编辑界面中切换到Variables选项卡,然后在Value列中通过nextval函数带入刚才定义的序列数即可,如下图所示