分享人:Digoal 阿里云资深数据库专家
正文:
本篇内容将通过三个部分来介绍PG+MySQL第3课。
一、压测工具
二、瞬间构造大量测试数据
三、压测case
一、压测工具
在开源的PG官方社区,提供了pg bench压测工具。它是最常用的压测工具,能够支持自定义,客户端的开销最小。用户可以查询官网的帮助文档,有详细的使用方法。pg bench不需要写任何脚本,可以直接调用客户端的命令,大大提升了工作效率。它有连接数、线程数、报告、绑定变量、重置连接等参数选项。有多种自定义的模型方法,比如变量,变量传递,随机数,多脚本调用和权重,睡眠等等。
二、瞬间构造大量测试数据
接下来,我们怎样快速生成数据?如果我想创建一个表,需要去快速生成1000万条记录。
第一种方法,我们用pg bench频繁的调用脚本。首先创建一个test表,创建一个序列,然后写入1000万条记录。C1变量设置为1~10000的随机值,c2设置为1~1000的随机值,c3设置为1~100的随机值。我们写一个test脚本,内容如上图。
第二种方法是用批量的方式,利用批量的方式,可以很容易的一次性生成大量的记录。c1的取值空间是1~10000,c2取值空间是1~1000,c3取值空间是1~100。id是序列产生的值,时间是一个时钟时间。如果要批量生成1000万条记录,也可以使用一次写多条的方法,用pg bench做样式压测。
除了批量和调用脚本的方式,我们还可以自定义一些函数,帮我们构造字段内容,根据我们的需求去构造内容字符串。如上图所示。
三、压测case
接下来,我们讲几个压测 case。主要有tpcb,简单key查询,upsert,随机数变量,模糊查询等等。
第一是tpcb。tpcb的测试比较简单。tpcb用104个连接,测120秒,测只读,它每秒会返回一次。如果标准方差抖动比较严重,说明性能抖动比较严重。稳定下之后,它的qps在150万以上,每一次的请求的平均响应时间,在零点零几毫秒。
接下来,我们看看upsert。首先,创建一个a表,其中有一个字段是组件。取值范围id是1~20亿。如果说id已经存在,把.info,crt_time设置为当前输入值。然后,自定义一个test.sql脚本。有两百多万次的update,两千多万次的更。随着数据越来越多,冲突的概率越来越高,update也就越来越多。等120秒跑完之后,它会输出一个test报告。
随机数变量random,随机值取值范围是(x,y)。random的概率是完全随机的。指数分布的概率是通过x,y代表最大值和最小值。高斯分布的概率是通过f(i + 0.5) - f(i - 0.5) 来定义。它是中型分布,当概率分布越靠近取值范围的中间,概率越高。zip的概率分布是((i+1)/i)**parameter。综上所述,我们可以根据自己的业务,使用不同的随机值生成函数。
接下来,我们讲讲模糊查询。我们创建两个表,即t1表和t2表。T1表是做查询的表,t2表是种子表。在t1表插入1000万条记录,t2表插入100万条记录。其中有10万条是随机的,另外90万条自t1表。其中取了十个长度的随机字符。t2表里有10万条匹配不了,其中有90万条能够匹配。即90%能够匹配,就查询时有10%是匹配不到。1000万的记录,通过前后百分号的模糊查询,只花了十几毫秒。因为pg支持倒排索引,它的平均响应时间在35毫秒左右。
接下来,我们看看如何查询轨迹历史?这比共享单车,我们在骑行过程中,骑行会产生位点,这些位点就是我们轨迹的订单。如果骑行十分钟,会上报个几十个位点。所以我们在模拟这样的数据。在表里面写入1000万条记录,随机值是1~10000,创建ordid索引,ordid等于1~10000的随机值。查询之后,我们发现,之前需要一千多个数据块,现在只需要访问十六个数据块。大大提升了轨迹查询的性能。
我们来看一下,数值相近查询。假设有一个表,其中有一个字段是年龄。我们按照年龄排序。比如越靠近24岁,返回值就越靠前。这个时候,我们需要用gist索引。创建一个t_num表。用浮点型来表示,浮点型取值范围在0~120之间。我们在里面写了1000万条记录,开始查询时,越靠近24岁的值,返回值越靠前。
接下来,我们看看空间距离相近查询。比如饿了么订餐,我在某个酒店里订餐,以酒店为中心,圈出附近100个餐馆。表里写了1000万个位点,用位置索引,其中,有零点几个毫秒就返回的,那么它一定是离你最近的。
第一对于高并发的请求,我们推荐用长链接和绑定变量。对于分析型的查询,因并发不高,而且每次查询都会重新生成执行计划。所以我们不建议用绑定变量。故分析场景,不建议绑定变量;高并发场景建议用绑定变量。