广告
返回顶部
首页 > 资讯 > 数据库 >Instagram中怎么提升PostgreSQL性能
  • 437
分享到

Instagram中怎么提升PostgreSQL性能

2024-04-02 19:04:59 437人浏览 安东尼
摘要

本篇文章为大家展示了Instagram中怎么提升postgresql性能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 局部索引如果我们经常需要按某个固定的特征

本篇文章为大家展示了Instagram中怎么提升postgresql性能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1. 局部索引

如果我们经常需要按某个固定的特征过滤数据,而且这个特征只存在于一小部分行里,在这种情况下,局部索引非常有效。

比方说,Instagram搜索标签的时候,我们需要找出有许多照片的标签。我们一般会用elasticsearch之类的技术来进行高级搜索,不过这里只靠数据库的查询能力就完全够了。先来看一下,按标签查询,并按照片数排序,Postgres是怎么做的:
 

EXPLaiN ANALYZE SELECT id from tags WHERE name LIKE 'snow%' ORDER BY media_count DESC LIMIT 10;   
QUERY PLAN 
---------                                 
 Limit (cost=1780.73..1780.75 rows=10 width=32) (actual time=215.211..215.228 rows=10 loops=1)
  -> Sort (cost=1780.73..1819.36 rows=15455 width=32) (actual time=215.209..215.215 rows=10 loops=1)
     Sort Key: media_count
     Sort Method: top-N heapsort Memory: 25kB
     -> Index Scan using tags_search on tags_tag (cost=0.00..1446.75 rows=15455 width=32) (actual time=0.020..162.708 rows=64572 loops=1)
        Index Cond: (((name)::text ~>=~ 'snow'::text) AND ((name)::text ~<~ 'snox'::text))
        Filter: ((name)::text ~~ 'snow%'::text)
 Total runtime: 215.275 ms
(8 rows)

有没有看到,为了得到结果,Postgres不得不对15000行数据进行排序。由于标签的分布满足长尾模式(译者注: 根据百度百科,「我们常用的汉字实际上不多,但因出现频次高,所以这些为数不多的汉字占据了上图广大的红区;绝大部分的汉字难得一用,它们就属于那长长的黄尾。」),我们可以改为查询超过100张照片的标签,先建局部索引:
 
CREATE INDEX CONCURRENTLY on tags (name text_pattern_ops) WHERE media_count >= 100
然后查询,看一下新的查询计划:
 

EXPLAIN ANALYZE SELECT * from tags WHERE name LIKE 'snow%' AND media_count >= 100 ORDER BY media_count DESC LIMIT 10;
 
QUERY PLAN
 Limit (cost=224.73..224.75 rows=10 width=32) (actual time=3.088..3.105 rows=10 loops=1)
  -> Sort (cost=224.73..225.15 rows=169 width=32) (actual time=3.086..3.090 rows=10 loops=1)
     Sort Key: media_count
     Sort Method: top-N heapsort Memory: 25kB
     -> Index Scan using tags_tag_name_idx on tags_tag (cost=0.00..221.07 rows=169 width=32) (actual time=0.021..2.360 rows=924 loops=1)
        Index Cond: (((name)::text ~>=~ 'snow'::text) AND ((name)::text ~<~ 'snox'::text))
        Filter: ((name)::text ~~ 'snow%'::text)
 Total runtime: 3.137 ms
(8 rows)

可以看到,Postgres只需要访问169行,所以速度快得多。Postgres的查询计划器对约束的评估也很有效。如果以后想要查询超过500张照片的标签,由于这个结果集是上面集合的子集,所以仍然会使用这个局部索引。

2. 函数索引

在某些表上,我们需要对一些很长的字符串建立索引,比如说,64个字符的base64记号。如果直接建索引的话,会造成大量的数据重复,这种情况下,可以用Postgres的函数索引:
 

CREATE INDEX CONCURRENTLY on tokens (substr(token), 0, 8)

虽然这样会造成许多行匹配相同的前缀,但我们可以在匹配的基础上再用过滤,速度很快。而且索引很小,只有大概原来的十分之一。

3. 用pg_reorg来让数据更紧凑

随着时间的流逝,Postgres的表会变得越来越零碎(由mvcC并发模型等原因引起)。而且,数据行插入的顺序往往也不是我们希望返回的顺序。比如说,如果我们经常要按用户来查询照片等,那么最好是在磁盘上把这些东西放在一起,这样就可以减少磁盘寻道的时间。

我们用pg_reorg来解决这个问题,它用三个步骤来让“压紧”一个表:

  1.     取得表的独占

  2.     建一个记录变更的临时表,在原始表上加一个触发器,把对原始表的变更复制到临时表上

  3.     用CREATE TABLE...SELECT FROM...ORDER BY建表,新表拥有原始表的全部数据,而且是按索引顺序排序的

  4.     将CREATE TABLE执行时间点以后发生的变更从临时表同步过来

  5.     业务切换到新表

每一步都会有很多细节,不过大体上就是像上面这个样子。我们先对这个工具进行了一些审查,运行了若干测试,然后再把它用到生产环境上。现在,我们已经在几百台机器的环境上跑过几十次pg_reorg,没出现过任何问题。


4. 用WAL-E进行WAL(写前日志)的归档和备份

我们用WAL-E来归档WAL日志,它是Heroku写的一个工具,我们也向它贡献了一部分代码。WAL-E大大简化了数据备份和复制库创建的过程。

WAL-E是利用Progres的arcHive_command,将PG产生的每个WAL文件都归档到Amazon的S3。利用这些WAL文件和数据库的基准备份,我们可以将数据库恢复到基准备份后任何一个时间点的状态。利用这个手段,我们也可以快速创建只读的复制库或故障备用库。

我们为WAL-E写了一个简单的封装脚本,可以监控归档时的重复故障,见GitHub
 
5. psycopg2中的自动提交模式和异步模式

我们也开始用psycopg2中的一些高级功能(psycopg2是Postgres的python驱动)。

一个是自动提交模式。在这个模式里,psycopg2不会发出BEGIN/COMMIT,每个查询跑在自己的单语句事务里。这对不需要事务的只读查询特别有用。开启很简单:

connection.autocommit = True

开启自动提交后,我们的应用服务器和数据库之间的对话大减,数据库服务器的CPU用量也大减。而且,我们是用PGBouncer作为连接池,开启自动提交后,连接的归还也更快了。

Django的交互细节可以看这里。

上述内容就是Instagram中怎么提升Postgresql性能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: Instagram中怎么提升PostgreSQL性能

本文链接: https://www.lsjlt.com/news/56976.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Instagram中怎么提升PostgreSQL性能
    本篇文章为大家展示了Instagram中怎么提升PostgreSQL性能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1. 局部索引如果我们经常需要按某个固定的特征...
    99+
    2022-10-18
  • 怎么提升PostgreSQL性能
    本篇内容介绍了“怎么提升PostgreSQL性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用Post...
    99+
    2022-10-18
  • 怎么提升Web性能
    本篇内容介绍了“怎么提升Web性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!为什么web性能如此重要真...
    99+
    2022-10-19
  • 怎么提升css性能
    小编给大家分享一下怎么提升css性能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!提升方法: 1、将样式写在css文件中,在head中引用;2、不使用“@impo...
    99+
    2023-06-15
  • 怎么提升JSON.stringify()的性能
    本篇内容介绍了“怎么提升JSON.stringify()的性能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-19
  • Oracle12c中怎么提升分布式性能
    本篇文章给大家分享的是有关Oracle12c中怎么提升分布式性能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Oracle 12c R2最近发...
    99+
    2022-10-18
  • HugePages 中怎么提升数据库性能
    本篇文章给大家分享的是有关HugePages 中怎么提升数据库性能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。内存是计算机的重要资源,虽然今...
    99+
    2022-10-18
  • 怎么提升移动Web性能
    这篇文章主要介绍“怎么提升移动Web性能”,在日常操作中,相信很多人在怎么提升移动Web性能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么提升移动Web性能”的疑惑有所帮...
    99+
    2022-10-19
  • React组件性能怎么提升
    这篇文章主要介绍了React组件性能怎么提升的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇React组件性能怎么提升文章都会有所收获,下面我们一起来看看吧。react组件的性能优化的核心是减少渲染真实DOM节点...
    99+
    2023-07-05
  • MongoDB怎样提升性能
    小编给大家分享一下MongoDB怎样提升性能,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MongoDB 是高性能数据,但是在使用的过程中,大家偶尔还会碰到一些性能问题。MongoDB和其它关...
    99+
    2022-10-18
  • kettle性能及效率怎么提升
    要提升水壶的性能和效率,可以考虑以下几个方面:1. 选择合适的材质:选择具有良好导热性能的材质,如不锈钢或铝合金,可以使水壶快速传热...
    99+
    2023-09-20
    kettle
  • 怎么提升韩国服务器性能
    提升韩国服务器性能的方法:1、采用虚拟化技术,能充分优化每台韩国服务器的性能,最大限度地延长服务器的正常运行时间,且还可以降低开支和节省空间;2、使用管理工具进行服务器管理,如采用DCIM来提升韩国服务器管理效率,实现规划工作负载分配;3、...
    99+
    2022-10-14
  • 怎么使用OPCache提升PHP的性能
    这篇文章给大家分享的是有关怎么使用OPCache提升PHP的性能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampServ...
    99+
    2023-06-14
  • Go语言中怎么提升Ruby应用的性能
    这篇文章将为大家详细讲解有关Go语言中怎么提升Ruby应用的性能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.低成本且易用的并发按照Go的设计,几十个(甚至上千个)并发操作能够轻而易举的...
    99+
    2023-06-17
  • 详解PostgreSQL提升批量数据导入性能的n种方法
    关键字:批量数据导入,数据加载,大量插入,加快,提升速度 多元化选择时代,人生里很多事物都是如此,凡事都没有一成不变的方式和方法。不管白猫黑猫,能抓老鼠的就是好猫,适合自己的就是最好...
    99+
    2022-11-11
  • 怎么让你的Nginx提升10倍性能
    本篇内容主要讲解“怎么让你的Nginx提升10倍性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么让你的Nginx提升10倍性能”吧! 1   建议一:使用反向...
    99+
    2023-06-16
  • 怎么用小程序接口提升性能
    这篇文章主要讲解了“怎么用小程序接口提升性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用小程序接口提升性能”吧!便捷优雅从PC时代的物理键盘鼠标到移动端时代手指,虽然输入设备极大精简...
    99+
    2023-06-26
  • 怎么提升香港虚拟空间的性能
    提升香港虚拟空间性能的方法:1、使用磁盘阵列解决I/O瓶颈问题,提高香港虚拟空间数据存取的能力;2、给操作系统分区保留足够的空间,避免出现因空间不足导致速度变慢;3、根据自身实际情况合理配置虚拟内存,减少内存不足的问题发生;4、保持操作系统...
    99+
    2022-10-21
  • php-fpm怎么进行优化来提升性能
    这篇文章主要讲解了“php-fpm怎么进行优化来提升性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php-fpm怎么进行优化来提升性能”吧!PHP是无处不在的,可以说是互联网 Web 应...
    99+
    2023-06-30
  • Android中怎么仿instagram实现文字自动排版功能
    这篇文章主要介绍“Android中怎么仿instagram实现文字自动排版功能”,在日常操作中,相信很多人在Android中怎么仿instagram实现文字自动排版功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作