顶级大厂Quora如何优化数据库性能?

这篇具有很好参考价值的文章主要介绍了顶级大厂Quora如何优化数据库性能?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

顶级大厂Quora如何优化数据库性能?

Quora 的流量涉及大量阅读而非写入,一直致力于优化读和数据量而非写。

0 数据库负载的主要部分

  • 读取
  • 数据量
  • 写入

1 优化读取

1.1 不同类型的读需要不同优化

① 复杂查询,如连接、聚合等

在查询计数已成为问题的情况下,它们在另一个表中构建了计数,以便它们可以直接读取计数值而非计算计数。

② 大型扫描

他们使用 LIMIT 改变它或使用分页

③ 模式与查询之间不匹配

若:

  • 无很好的索引
  • 或索引没有足够的列
  • 或索引中的列顺序对查询来说不是最佳

则查询可能很慢,可能对数据库造成很大负载。

这种情况下,通常会修改索引以对查询进行优化。 有时查询也可修改以对索引进行优化。如:

  • 删除 select 子句中不必要的列(特别是索引中不存在的列)
  • 删除 order by 子句,改为在客户端上排序(MySQL CPU 一般比客户端 CPU 更宝贵)
  • 若该查询提供的功能不再重要,可完全删除查询

1.2 高 QPS 查询

即使使用了优化的 SQL 和良好的模式,高 QPS查询也给数据库带来很大负载。有时可能表示缓存效率低下(甚至没缓存)。

① 低效的缓存是否导致了高 QPS 查询?

缓存通常用于减少数据库 QPS。缓存键的选择可以极大地影响缓存的效率:

  • 若缓存键过于具体或狭窄,可能导致数据库出现高 QPS
  • 若缓存键太宽泛,每次查询都会从数据库中拉取大量数据

② 对用户语言表的查询

我们有一个表跟踪用户使用的语言信息。通常会查询数据库以查看用户 U 是否使用语言 L。使用(uid,language_id)作为缓存键看起来合理。如缓存未命中,将为该 uid 和 language_id 查询数据库表。

因此,将缓存键更改为仅使用 uid 确实有意义,缓存值将是有关用户使用的所有语言的信息。

以上述方式更改缓存键,会增加从库表中每次查询获取的数据量,但它将 QPS 减少超过 90%。大多数用户只使用一或几种语言。 因此,大多数情况,新的查询并没有拉取比以前更多的数据,这是一个显然的优化!

③ 查询 A2A(ask to answer)表

这里我们处理 3 个实体间的关系,即用户(谁提问或关注问题)、问题和回答者,这比 2 个实体之间的关系更不常见。

通常产品逻辑是查询:

  • 用户已请求过的所有回答者,使用缓存键 (question_id, user_id)
  • 请求过相同回答者回答一个问题的所有用户,使用缓存键 (question_id, answerer_id)

综上,A2A 表的 QPS 非常高,这意味着上述缓存效果并不明显。上述两个缓存都在使用 2 个实体作为缓存键question_id 和 user_id(可以是提问者或回答者)。

潜在缓存键数量巨大,因为它是问题数和用户数的乘积,其中只有很少的组合实际上在表中有数据。所以它可看作一个稀疏的数据集,有2维。

大多数问题的 A2A 请求数量相对较少,但有少数问题的 A2A 数量要多得多。因此,添加额外缓存,该缓存包含问题的 A2A,最多限制为 N 个,以便我们捕获大多数问题。 该缓存的键只是 question_id。 如缓存列表大小小于N,我们知道缓存是完整的。 否则,缓存不完整,我们不会使用缓存。

这额外缓存帮助显著减少 A2A 表上的 QPS(在 50% 到 66% 的范围内)。 还对产品逻辑进行了其他更改,以提高效率,但 QPS 的减少大部分来自额外缓存。

1.3 一维数据集中的稀疏数据

Quora 在缓存方面经常遇到的另一个问题是:稀疏一维数据集。如可能需要查询数据库,看某问题是否需重定向到另一问题(如同一个问题被重新发布,就可能发生这种情况)。

绝大多问题不需要重定向,所以 Quora 只会获取几个“重定向”,而大量“不重定向”。

当他们只是缓存了 question_id ,缓存中就会填满不用,只有几个重定向。 这在缓存中占用大量空间,且由于“重定向”数量如此稀疏,也会导致大量缓存未命中。

相反,他们开始缓存范围。 如 question id 123–127的任一问题都没重定向,那么他们会将该范围缓存为所有问题均为 No,而不是缓存每个单独的 question id。

这大大降低此类查询的数据库负载,QPS 下降 90%。

2 优化表占用空间

由于以下几个原因,表大小很重要:

  • 存储更多数据的成本更高
  • 随表增长,适应数据库缓冲池的数据百分比会变小,即IO会逐渐增加,性能会逐渐下降
  • 备份和恢复时间会随表大小线性增长。虽然备份是从 MySQL 副本完成的,但我们也会从副本读数据。在备份期间,MySQL副本性能略有下降
  • 随表增长,备份大小也在增长,导致备份存储成本随时间增长

显然,对不需要永久存储的数据,制定最佳保留策略有助减少表大小 —— 使用 MyRocks 减少表大小

  • 有一些表对于表所有者来说无法接受任何数据的删除。为此研究使用 MyRocks 来减小空间使用
  • MySQL 中的表可能使用更复杂的模式和查询。 所以他们希望谨慎使用 MyRocks。 作为分片项目的一部分,已对 MySQL 中最大的表进行分片,这是在 MySQL 在 Quora 的分片中记录
  • 此表是基于自增列范围进行分片的,与基于时间的分片接近,因为自增列值随时间增加
  • 大多数查询访问最近的分片。 包含 18 个月以上旧数据的较旧分片对日常业务相对不太关键

因此,他们决定按如下方式将较旧的分片移至 MyRocks。 有个工具可将 MySQL 表从一个 MySQL 主服务器移动到另一个主服务器。 每个分片实际上是一个 MySQL 表。 他们能够使用该工具按如下方式将包含旧数据的 MySQL 分片转换为 MyRocks 分片:

  • 在 MyRocks 主服务器上使用相同的模式创建一个新的空表,但使用 RocksDB 存储引擎
  • 使用该工具复制数据并从 MySQL 主服务器重放binlog(二进制日志)到 MyRocks 主服务器。 (该工具已被修改为跳过在目标主机上创建表,因为它已经在前一步中创建过。)
  • 执行阴影读取测试以验证 MyRocks 分片返回的结果与 MySQL 分片的结果相同。
  • 将流量切换到 MyRocks 分片。 (这类似于我们在将 MySQL 表从一个 MySQL 主服务器移动到另一个 MySQL 主服务器时执行的切换。 源主机上的表被重命名以停止新写入,然后在重放赶上后,该表的流量会切换到目标主机。)
  • 对于非键值存储表使用 MyRocks 是我们的一个重大举措。 根据表的不同,空间使用量的减少也有差异。 对于上面提到的第一个表,我们看到每个已移动的分片使用的空间减少了 80% 以上! 对于第二个表,我们看到每个已移动的分片使用的空间只减少了约 50-60%

3 优化写入

有时复制延迟警报,因为 MySQL复制默认情况下会在副本上串行重放主服务器上的并发写。在主服务器上并行写入而在副本上串行重放写入并不适合扩展写入,特别是如果他们使用带多核 CPU 的机器。

MySQL 提供两种方法实现这点,如下所述。两种方法中都需使用 slave_parallel_workers 配置并行度。

  1. slave_parallel_type=LOGICAL_CLOCK(从 MySQL 8.0.26 开始为 replica_parallel_type)
  • MySQL 5.7开始可用。即使所有表都在同一逻辑数据库中,它也可以在副本上并行执行写。
  1. slave_parallel_type=DATABASE(从 MySQL 8.0.26 开始为 replica_parallel_type)
  • 这需要表位于多个逻辑数据库中才能并行执行写
  • 增强存储在 zk 中的数据库配置,以跟踪表所在的逻辑数据库。将此信息保存在 zk 而非代码库或静态配置中,允许动态更改现有表的逻辑数据库。大多数表都位于默认逻辑数据库,因此只需要为不在默认逻辑数据库中的表保留此信息
  • MySQL alter table 语句可用于更改表的逻辑数据库,如 alter table <logical_db1>.table rename <logical_db2>.mytable。 它不复制数据,只是将底层 ibd 文件从一个目录移动到另一个目录,速度很快。移动表后,我们还会在 zk 更新数据库配置,以便应用程序可找到该表
  • 他们将一个表移动到其自己的逻辑数据库并启用并行复制。有助减少包含该表的 MySQL 副本上的复制延迟。

4 结论

学习了世界级大厂如何使用各种技术的组合来优化数据库中的读取、写入和空间使用。你们公司如何优化的呢?欢迎和我一起交流。

参考:

  • https://www.percona.com/blog/scaling-mysql-a-good-problem-to-have

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-747678.html

到了这里,关于顶级大厂Quora如何优化数据库性能?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【性能优化】MySql数据库查询优化方案

    了解系统运行效率提升的整体解决思路和方向 学会MySQl中进行数据库查询优化的步骤 学会看慢查询、执行计划、进行性能分析、调优 ​关于这个问题,我们通常首先考虑的是硬件升级,毕竟服务器的内存、CPU、磁盘IO速度 、网络速度等都是制约我们系统快慢的首要因素。硬

    2024年02月03日
    浏览(59)
  • Oracle 数据库表性能优化

    最近在一次工作过程中,遇到了oralce 表性能慢的问题。一个历史表,一个月将近1000多万的数据量,想查询这个表的数据,只使用了一个简单的语句,却一个多小时都查不出来。于是决定对Oracle 的这张表的性能进行一下优化。本人不是一个专门搞数据库这块的dba,所以只能粗

    2024年02月03日
    浏览(58)
  • 数据库性能优化的基本方法

    一、基本方法 数据库表结构优化。优化表结构,避免过度冗余设计和数据重复。 索引优化。根据查询需求,建立合适的索引,提高查询速度。 查询语句优化。编写高效的查询语句,避免全表扫描和子查询,减少 JOIN 操作。 数据库缓存优化。使用缓存技术,将频繁访问的数据

    2024年02月15日
    浏览(64)
  • MongoDB 数据库性能优化技巧

    原文:MongoDB 数据库性能优化技巧 (techdatafuture.com) MongoDB 是一款灵活且可扩展的NoSQL数据库,为了提高其性能,我们可以采取一些优化技巧。本文将介绍一些MongoDB性能优化的关键点,包括索引的使用、查询优化、数据模型设计和硬件优化等。          1.合理使用索引     索

    2024年02月09日
    浏览(76)
  • MySQL数据库性能优化技巧介绍

    MySQL是目前最流行和广泛使用的开源关系型数据库之一,随着数据量的增长和访问负载的提高,优化数据库性能变得至关重要,以确保系统能够高效地处理大量的并发请求。本文将记录一些MySQL数据库性能优化的技巧,提高数据库的运行效率,提升系统性能。 对于MySQL,最简单

    2024年02月08日
    浏览(134)
  • MySQL数据库进行性能优化的思路

    对MySQL数据库进行性能优化的思路可以涵盖以下方面: 索引优化: 索引是提高查询性能的关键。确保表中的关键列和经常用于查询条件的列都被适当地创建了索引。可以使用 CREATE INDEX 语句添加索引,或者使用 ALTER TABLE 语句在已有表上添加索引。例如,对于一个用户表中的

    2024年02月06日
    浏览(55)
  • 达梦8数据库性能优化思路浅谈

        作为一名DBA,SQL优化是我们工作中必不可少的技能,在投产的系统中,存在大量的SQL语句需要我们分析和快速做出处理。很是考验我们的经验。这些慢SQL的原因有很多,有SQL编码不规范,设计有缺陷,SQL场景未考虑全面,数据量未评估等,预先需要建立索引的表而未设计建

    2024年02月06日
    浏览(45)
  • 数据库——MySQL高性能优化规范

    所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 MySQL 保留(如果表名中包含查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 临时库表必须以 tmp_为前缀并以日期为后缀,

    2024年02月11日
    浏览(104)
  • 数据库优化系列教程(2)—性能评估和监控

            这一步骤对于数据库优化至关重要。性能评估帮助我们深入了解当前系统的运行状况,而监控系统则确保我们能够实时了解数据库的性能变化。及时的评估和监控有助于快速识别和解决潜在问题,确保数据库系统能够稳定高效地运行。         在性能评估中,

    2024年01月16日
    浏览(62)
  • MySQL——性能优化与关系型数据库

    吞吐与延迟:有些结论是反直觉的,指导我们关注什么。 没有量化就没有改进:监控与度量指标,指导我们怎么去入手。 80/20原则:先优化性能瓶颈问题,指导我们如何去优化。 过早的优化是万恶之源:指导我们要选择优化的时机。 脱离场景谈性能都是耍流氓:指导我们对

    2024年02月01日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包