
正文
postgresql访问速度的简单介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
如何加快PostgreSQL结巴分词加载速度
PostgreSQL的全文检索接口是开放API的,所以中文分词的插件也非常多,例如常用的scws分词插件,还有结巴分词的插件。
但是你在使用结巴分词插件的时候,有没有遇到这样的问题。
每个会话,第一次查询会比较慢,接下来的查询就快了。
相关问答
Q1: 为什么postgrelsql的性能没有mysql好
一、 PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃、断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统库是MyISAM的,相比之下,PG数据库这方面要好一些。
二、任何系统都有它的性能极限,在高并发读写,负载逼近极限下,PG的性能指标仍可以维持双曲线甚至对数曲线,到顶峰之后不再下降,而 MySQL 明显出现一个波峰后下滑(5.5版本之后,在企业级版本中有个插件可以改善很多,不过需要付费)。
三、PG 多年来在 GIS 领域处于优势地位,因为它有丰富的几何类型,实际上不止几何类型,PG有大量字典、数组、bitmap 等数据类型,相比之下mysql就差很多,instagram就是因为PG的空间数据库扩展POSTGIS远远强于MYSQL的my spatial而采用PGSQL的。
四、PG 的“无锁定”特性非常突出,甚至包括 vacuum 这样的整理数据空间的操作,这个和PGSQL的MVCC实现有关系。
五、PG 的可以使用函数和条件索引,这使得PG数据库的调优非常灵活,mysql就没有这个功能,条件索引在web应用中很重要。
六、PG有极其强悍的 SQL 编程能力(9.x 图灵完备,支持递归!),有非常丰富的统计函数和统计语法支持,比如分析函数(ORACLE的叫法,PG里叫window函数),还可以用多种语言来写存储过程,对于R的支持也很好。这一点上MYSQL就差的很远,很多分析功能都不支持,腾讯内部数据存储主要是MYSQL,但是数据分析主要是HADOOP+PGSQL。
七、PG 的有多种集群架构可以选择,plproxy 可以支持语句级的镜像或分片,slony 可以进行字段级的同步设置,standby 可以构建WAL文件级或流式的读写分离集群,同步频率和集群策略调整方便,操作非常简单。
八、一般关系型数据库的字符串有限定长度8k左右,无限长 TEXT 类型的功能受限,只能作为外部大数据访问。而 PG 的 TEXT 类型可以直接访问,SQL语法内置正则表达式,可以索引,还可以全文检索,或使用xml xpath。用PG的话,文档数据库都可以省了。
九,对于WEB应用来说,复制的特性很重要,mysql到现在也是异步复制,pgsql可以做到同步,异步,半同步复制。还有mysql的同步是基于binlog复制,类似oracle golden gate,是基于stream的复制,做到同步很困难,这种方式更加适合异地复制,pgsql的复制基于wal,可以做到同步复制。同时,pgsql还提供stream复制。
十,pgsql对于numa架构的支持比mysql强一些,比MYSQL对于读的性能更好一些,pgsql提交可以完全异步,而mysql的内存表不够实用(因为表锁的原因)
最后说一下我感觉 PG 不如 MySQL 的地方。
第一,MySQL有一些实用的运维支持,如 slow-query.log ,这个pg肯定可以定制出来,但是如果可以配置使用就更好了。
第二是mysql的innodb引擎,可以充分优化利用系统所有内存,超大内存下PG对内存使用的不那么充分,
第三点,MySQL的复制可以用多级从库,但是在9.2之前,PGSQL不能用从库带从库。
第四点,从测试结果上看,mysql 5.5的性能提升很大,单机性能强于pgsql,5.6应该会强更多.
第五点,对于web应用来说,mysql 5.6 的内置MC API功能很好用,PGSQL差一些。
另外一些:
pgsql和mysql都是背后有商业公司,而且都不是一个公司。大部分开发者,都是拿工资的。
说mysql的执行速度比pgsql快很多是不对的,速度接近,而且很多时候取决于你的配置。
对于存储过程,函数,视图之类的功能,现在两个数据库都可以支持了。
另外多线程架构和多进程架构之间没有绝对的好坏,oracle在unix上是多进程架构,在windows上是多线程架构。
很多pg应用也是24/7的应用,比如skype. 最近几个版本VACUUM基本不影响PGSQL 运行,8.0之后的PGSQL不需要cygwin就可以在windows上运行。
至于说对于事务的支持,mysql和pgsql都没有问题。
Q2: Postgresql 建索引性能优化
客户新上线了一套监控系统,可以监控到所有的执行慢的SQL,监控到有个批量任务导入大量数据后,进行索引创建。耗时需要几分钟,虽然不影响业务,但是需要整改。
这种问题的处理思路,都是大拆小,搞并发。
在测试环境,创建一个大表进行测试,创建大量的假数据。
创建表
随机字符串生成函数
生成大量的数据
经测试发现这种方法创建数据太慢了,改成使用COPY的方式创建数据。
排查发现random_string效率太低,生成一条数据接近1ms
重新创建表
写程序创建8600万条数据放在test.csv中
导入大量数据
测试基准数据
\timing 开启计时
耗时532824.434 ms
耗时385838.893 ms,提升 38%的性能,非常不错,但是远远不够。
仍然会出发告警。
重新创建表
创建分区
并发创建INDEX,并记录每个分区索引创建的开始时间和结束时间;
耗时 = 最大结束时间 - 最小开始时间 = 137 s,速度提升接近4倍。
顺序创建INDEX,并记录每个分区索引创建的开始时间和结束时间;
耗时 = 每个索引的耗时相加 = 457358.14 ms,速度提升 16.5%
顺序创建INDEX,优化并发
耗时 = 每个索引的耗时相加 = 292027.642 ms, 速度提升接近两倍。
在开启了并发参数的情况下,如果再叠加并发分区INDEX创建,会不会有惊喜呢?
并发创建INDEX,并记录每个分区索引创建的开始时间和结束时间;
耗时 = 最大结束时间 - 最小开始时间 = 141 s,速度还不如默认并发参数下的表现。应该是资源发生争抢导致的,通过系统监控发现CPU已经打满了。
分区并发是目前能想到的最优化手段了。
还需要结合查询的情况进行分析,分区会带来一点点的性能下降是否影响也需要考虑一下。
分区时目前能避开监控报警的唯一手段了,另外还钻了监控报警的空子。
客户的监控是基于单条语句的,单个分区的最大创建时间为47s,控制在分钟以内了。
Q3: 如何通过RamDisk的方法加速小型数据库的访问速度
RamDisk简介 本文首先介绍了如何在rh 系统上创建一个RamDisk 然后介绍了如何通过将数据库内容存放到RamDisk中的方法来加速对数据库的访问 什么是RamDisk?一个RamDisk是分配作为一个分区的内存块 或者说将内存模拟为硬盘空间 从而可以想对待硬盘空间一样在其上保存文件 为什么会要使用RamDisk呢?主要是为了提高速度 若事先知道特定的文件将被高频率访问 通过将文件存放在内存里就可以提高性能 例如web服务器就可以采用这种方式来加快访问速度 下面是一些可能会对加深对RamDisk的理解的资源链接 /usr/src/linux/Documentation/RamDisk txt 如何使用RamDisk 使用RamDisk是非常简单的 首先 RH 的缺省安装本身就有对RamDisk的支持 你所要作的就是格式化一个RamDisk 然后加载(mount)其到目录结构下即可 通过命令 ls al /dev/ram* 可以查看系统可以利用的RamDisk的数目 这些RamDisk并不起作用 除非设置以后 下面是一个非常简单的使用RamDisk的例子 # create a mount point: mkdir /tmp/RamDisk # create a filesystem: mke fs /dev/ram # mount the RamDisk: mount /dev/ram /tmp/RamDisk 这三个命令分别为RamDisk创建一个目录 格式化它(创建文件系统) 最后加载该文件系统到 /tmp/RamDisk 上 下面就可以对待该目录为一个分区使用 若格式化失败 则说明你的系统内核没有对RamDisk的支持 则需要重新编译内核 RamDisk支持的内核开关是 CONFIG_BLK_DEV_RAM 缺省的RamDisk的大小为 Mb= 块 在创建randisk文件系统时可以得到RamDisk大小的信息 mke fs Jan for EXT FS b / / Linux ext filesystem format Filesystem label= inodes blocks blocks ( %) reserved for the super user First data block= Block size= (log= ) Fragment size= (log= ) block group blocks per group fragments per group inodes per group 运行命令 df k /dev/ram 可以查看可以真正使用的RamDisk的空间大小(因为创建文件系统时会占用一些空间) df k /dev/ram Filesystem k blocks Used Available Use% Mounted on /dev/ram % /tmp/RamDisk 需要注意的是当你的系统重新启动以后 RamDisk中的数据会丢失 所以如果RamDisk中的数据被修改了 必须将其备份到别的目录下 改变RamDisk的大小 为了使用RamDisk 可以通过将对RamDisk的支持编译进入内核中或者编译为模块的方式 在需要时将其加载 编译为模块的方式可以在加载模块时动态决定RamDisk的大小 当RamDisk被编译进入内核 改变RamDisk的大小的方法为在nf中田加内容 RamDisk_size= (or RamDisk= for old kernels) 然后运行lilo命令 重新启动机器 这样下次加载RamDisk以后 大小就变为 M boot=/dev/hda map=/boot/map install=/boot/boot b prompt timeout= image=/boot/vmlinuz label=linux root=/dev/hda read only RamDisk_size= 当编译RamDisk支持为模块形式 可以在加载时决定RamDisk的大小 可以通过杂/etc/conf module中添 options rd rd_size= 或者在动态加载是通过命令行的形式传入 in *** od rd rd_size= 下面是关于如何使用模块的一个例子 卸载前面加载的文件系统 umount /tmp/RamDisk 卸载模块 rmmod rd 加载RamDisk模块 并设置大小为 M in *** od rd rd_size= 创建一个文件系统 mke fs /dev/ram 加载RamDisk的文件系统 mount /dev/ram /tmp/RamDisk 在web服务器中使用RamDisk的例子 这里举一个在web服务器中使用三个RamDisk的例子 这里要确保web服务器的所有内容不超过 M(包括CGI的内容) 首先 对web服务器的root目录下的内容备份到其他地方 然后重新创建的根目录 mv /home/d/ /home/d_real mkdir /home/d mkdir /home/d/cgi bin mkdir /home/d/ mkdir /home/d/icons 然后 在/etc/rc d/init d/中添加如下启动执行信息 ### Make the RamDisk partitions / *** in/mkfs t ext /dev/ram / *** in/mkfs t ext /dev/ram / *** in/mkfs t ext /dev/ram ### Mount the RamDisks to their appropriate places mount /dev/ram /home/d/cgi bin mount /dev/ram /home/d/icons mount /dev/ram /home/d/ ### Copying real directory to RamDisks (the ### data on the RamDisks is lost after a reboot) tar C /home/| tar C /home/d x ### After this you can start the web server 注 切记若RamDisk中的数据被修改 并且做的修改都是有意义的 则需要对RamDisk中的数据做备份 你可以启动一个cron任务来完成这个工作 如 每10分钟检查一次看是否有数据被修改 若有则对数据进行备份 RamDisk的一个应用是使用/tmp做为RamDisk 若系统中有很多程序使用RamDisk 则可以很明显地加快系统速度 而且每次系统重新启动这些暂时数据都会丢失 通过RamDisk加速小型数据库的访问速度 如果将将PostgreSQL数据库服务器文件加载到内存中就可以加快数据库访问速度 在/test目录下加载RamDisk 一 在/test目录下设置RamDisk mkdir p /Test mkfs t ext /dev/ram mount /dev/ram /Test 这时候你将拥有一个4M大小的RamDisk 根据需要你可以更改你的RamDisk的大小 二 为PostgreSQL设置RamDisk 理想状态下 你将拥有两个数据库服务器 一个是可以进行修改的 另外一个是存放在RamDisk中的拷贝 为了达到这个目的 需要使用命令 pg_dump 或 pg_dumpall 注 这里假设已经在nf中设置RamDisk的大小 使其大于数据库服务器的大小 如果你希望了解合适的大小 可以使用命令 cd /var/lib/pgsql; du 然后 ### Stop the current postgresql server /etc/rc d/init d/postgres stop ### rename the current directory mv /var/lib/pgsql /var/lib/pgsql_main #### Create a directory to have our RamDisk on mkdir p /var/lib/pgsql_memory #### change the ownership of the new directory to postgres or whatever #### the actual owner is chown postgres /var/lib/pgsql_memory #### Make an alias or link to the original name /var/lib/pgsql ln s /var/lib/pgsql_memory /var/lib/pgsql #### Format the RamDisk mkfs t ext /dev/ram #### Mount the RamDisk to the postgresql directory mount /dev/ram /var/lib/pgsql_memory #### Copy everything from the main directory into the RamDisk tar C /var/lib/pgsql_main cp | tar C /var/lib/pgsql_memory xp ### Start the current postgresql server /etc/rc d/init d/postgres start 经过测试 发现在RamDisk中的PostgreSQL的性能提升最高达到 %左右 需要的时候 可以将其他的应用放置在RamDisk中以提升效率 如ldap服务器等 lishixinzhi/Article/program/Oracle/201311/16820
Q4: 为什么我在postgresql的json数据中查询,速度会比mysql慢很多
PostgreSQL 9.4 引入了jsonb,一个新的列类型用于存储文档到你的关系数据库中。jsonb和json在更高的层面上看起来几乎是一样的,但在存储实现上是不同的。使用jsonb的优势在于你可以轻易的整合关系型数据和非关系型数据,在性能方面,可以比大多数类似于MongoDB这样的非关系数据库更好理解json和jsonb之间的不同因此,两种列类型之间的区别是什么?当我们比较写入数据速度时,由于数据存储的方式的原因,jsonb会比json稍微的慢一点。json存储完整复制过来的文本输入,必须一遍又一遍的解析在你调用任何函数的时候。它不支持索引,但你可以为查询创建表达式索引。jsonb存储的二进制格式,避免了重新解析数据结构。它支持索引,这意味着你可以不使用指定的索引就能查询任何路径。其他的不同包括,json列会每次都解析存储的值,这意味着键的顺序要和输入的时候一样。但jsonb不同,以二进制格式存储且不保证键的顺序。因此,如果你有软件需要依赖键的顺序,jsonb可能不是你的应用的最佳选择。
关于postgresql访问速度和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。






