您当前的位置:首页 > 电脑百科 > 数据库 > 百科

使用 查询分离 后 从20s优化到500ms

时间:2022-09-19 11:21:46  来源:微信公众号  作者:不才陈某

在前面一篇文章中提到过对于业务主表读写缓慢的解决方案:冷热分离,有不了解的请看:业务主表读写缓慢如何优化?

冷热分离固然是一个性价比高的解决方案,但也并不是银弹,仍然有诸多限制,比如:

 

  1. 查询冷数据慢
  2. 业务无法修改冷数据
  3. 冷数据多到一定程度系统依旧扛不住

 

此时如果需要解决以上问题,可以采用另外一种方案:使用 查询分离 优化业务主表数据大查询缓慢的问题

什么是查询分离?

查询分离从字面上来说非常容易理解,其实就是在写数据时保存一个备份数据到另外的存储系统,在查询时直接从另外的存储系统中获取数据,如下图:


 

查询分离

以上只是简单的架构图,其中有些细节还是需要深究,如下:

 

  1. 什么时候触发查询分离?
  2. 如何实现查询分离?
  3. 查询数据的存储系统选型?
  4. 查询数据如何使用?
查询分离的适用场景?

 

当你在实际业务中遇到以下情形,则可以考虑使用查询分离解决方案。

 

  • 数据量大;
  • 所有写数据的请求效率尚可;
  • 查询数据的请求效率很低;
  • 所有的数据任何时候都可能被修改;
  • 业务希望我们优化查询数据的功能。

 

曾做过 SaaS 客服系统的架构优化,系统里有一个工单查询功能,工单表中存放了几千万条数据,且查询工单表数据时需要关联十几个子表,每个子表的数据也是超亿条。

面对如此庞大的数据量,跟前面的冷热分离一样,每次客户查询数据时几十秒才能返回结果,即便我们使用了索引、SQL 等数据库优化技巧,效果依然不明显。

工单表中有些数据是几年前的,客户说这些数据涉及诉讼问题,需要继续保持更新,因此我们无法将这些旧数据封存到别的地方,也就没法通过前面的冷热分离方案来解决。

最终我们采用了查询分离的解决方案,才得以将这个问题顺利解决:将更新的数据放在一个数据库里,而查询的数据放在另外一个系统里。因为数据的更新都是单表更新,不需要关联也没有外键,所以更新速度立马得到提升,每次客户查询数据时,500ms 内就可得到返回结果。

什么时候触发查询分离?

简单的来说就是什么时候应该保存一份数据到查询数据库中,其实也就是数据异构的过程,详细文章可以看我前面一篇文章:数据异构就该这样做,yyds~

这里介绍三种方式,如下:

 

  1. 同步建立
  2. 异步建立
  3. binlog方式
1、 同步建立

 

修改业务代码:在写入常规数据后,同步建立查询数据。


 

该种方案优缺点也非常明显:

优点:查询数据的一致性和实时性得到了保证

缺点:业务代码侵入比较强;减缓写操作的效率

2、 异步建立

修改业务代码:写入数据后,异步建立查询数据


 

该种方案的优缺点如下:

优点:不影响主流程

缺点:数据一致性存在问题

3、 binlog的方式

该种方案也是业界常用的一种方案,对于代码是无侵入的,通过监听数据库日志的方式建立查询数据,如下:


 

该种方案的优缺点如下:

优点:不影响主流程;代码侵入为0

缺点:数据一致性存在问题;架构相对复杂

如何实现查询分离?

对于上述三种方案都算是比较常见的方案,对于第一种同步的方式比较简单,这里不再介绍;对于第三种binlog的方式在数据异构的文章中介绍过,详情见:数据异构就该这样做,yyds~

这篇文章来介绍一下异步的方式,异步的方式有很多,可以放在内存中进行操作,但是这有些弊端:

 

  1. 数据过多,内存有限
  2. 服务重启,内存数据将会丢失

 

因此最终我们可以选择MQ的方式,那么此时就涉及到了MQ的技术选型,这里给两个建议:

 

  1. 如果你的公司已经用了MQ,那么直接接着用即可
  2. 如果公司目前未引入MQ,则需要架构组考量选型了,对于MQ的选型可以看我之前文章:聊聊 MQ 技术选型

 

当然一旦引入了MQ还需要考虑的问题很多,如下:

1、 MQ突然宕机了怎么办?

MQ宕机意味着查询数据不能继续建立了,我们可以在写入数据的同时给该条数据加一个标志字段(已搬运、未搬运),当MQ启动后,查询所有未搬运的数据,继续建立查询数据

 

“ 这里的方案很多,按照业务实际情况考量 ”
2、消息的幂等消费

 

消息的幂等消费一定要保证,避免数据重复建立,比如:主数据的订单 A 更新后,我们在查询数据中插入了 A,可是此时系统出问题了,系统误以为查询数据没更新,又把订单 A 插入更新了一次。

3、消息的时序性问题

比如某个订单 A 更新了 1 次数据变成 A1,线程甲将 A1 的数据搬到查询数据中。不一会儿,后台订单 A 又更新了 1 次数据变成 A2,线程乙也启动工作,将 A2 的数据搬到查询数据中。

所谓的时序性就是如果线程甲启动比乙早,但搬运数据动作比线程乙还晚完成,就有可能出现查询数据最终变成过期的 A1

查询数据的存储系统选型?

既然为了解决表数据量大查询缓慢的问题,肯定是不能选用关系型数据库了,那么还有其他选择吗?

内存数据库虽然性能非常高,比如redis,但是不适合海量数据,太费钱了

那么这里比较适用的有如下三种:

 

  1. MongoDB
  2. HBase
  3. Elasticsearch

 

这里选型还是要根据自己公司业务选择,如果已经有在用的,则直接用即可;另外就是选择自己熟悉的,比如当初我们设计架构方案时,为什么选择用 Elasticsearch,除 ES 对查询的扩展性支持外,最关键的一点是我们团队对 Elasticsearch 很熟悉。

查询数据如何使用?

查询数据很简单,每个数据库都有对应的API,直接调用查询

但是,这里有一个问题:数据查询更新完前,查询数据不一致怎么办?,给出两种方案:

 

  1. 在查询数据更新到最新前,不允许用户查询。(我们没用过这种设计,但我确实见过市面上有这样的设计。)
  2. 给用户提示:您目前查询到的数据可能是 1 秒前的数据,如果发现数据不准确,可以尝试刷新一下,这种提示用户一般比较容易接受。
总结

 

本篇文章介绍了表数据量大查询缓慢的一种解决方案:查询分离,但这也不是银弹,仍然是存在一些不足,比如表数据量大,写入缓慢怎么办?这个后面文章再介绍吧

当然查询分离还有一个重要的问题:历史数据如何迁移?这个处理也是非常简单,但是也有许多需要考虑的点,后文介绍

 

来源:https://mp.weixin.qq.com/s/8CEhYdCX7JpPzSkA7gXUfw 作者:不才陈某


Tags:查询分离   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
使用 查询分离 后 从20s优化到500ms
在前面一篇文章中提到过对于业务主表读写缓慢的解决方案:冷热分离,有不了解的请看:业务主表读写缓慢如何优化?冷热分离固然是一个性价比高的解决方案,但也并不是银弹,仍然有诸多限...【详细内容】
2022-09-19  Search: 查询分离  点击:(324)  评论:(0)  加入收藏
▌简易百科推荐
向量数据库落地实践
本文基于京东内部向量数据库vearch进行实践。Vearch 是对大规模深度学习向量进行高性能相似搜索的弹性分布式系统。详见: https://github.com/vearch/zh_docs/blob/v3.3.X/do...【详细内容】
2024-04-03  京东云开发者    Tags:向量数据库   点击:(5)  评论:(0)  加入收藏
原来 SQL 函数是可以内联的!
介绍在某些情况下,SQL 函数(即指定LANGUAGE SQL)会将其函数体内联到调用它的查询中,而不是直接调用。这可以带来显著的性能提升,因为函数体可以暴露给调用查询的规划器,从而规划器...【详细内容】
2024-04-03  红石PG  微信公众号  Tags:SQL 函数   点击:(5)  评论:(0)  加入收藏
如何正确选择NoSQL数据库
译者 | 陈峻审校 | 重楼Allied Market Research最近发布的一份报告指出,业界对于NoSQL数据库的需求正在持续上升。2022年,全球NoSQL市场的销售额已达73亿美元,预计到2032年将达...【详细内容】
2024-03-28    51CTO  Tags:NoSQL   点击:(14)  评论:(0)  加入收藏
为什么数据库连接池不采用 IO 多路复用?
这是一个非常好的问题。IO多路复用被视为是非常好的性能助力器。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以...【详细内容】
2024-03-27  dbaplus社群    Tags:数据库连接池   点击:(14)  评论:(0)  加入收藏
八个常见的数据可视化错误以及如何避免它们
在当今以数据驱动为主导的世界里,清晰且具有洞察力的数据可视化至关重要。然而,在创建数据可视化时很容易犯错误,这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可...【详细内容】
2024-03-26  DeepHub IMBA  微信公众号  Tags:数据可视化   点击:(7)  评论:(0)  加入收藏
到底有没有必要分库分表,如何考量的
关于是否需要进行分库分表,可以根据以下考量因素来决定: 数据量和负载:如果数据量巨大且负载压力较大,单一库单一表可能无法满足性能需求,考虑分库分表。 数据增长:预估数据增长...【详细内容】
2024-03-20  码上遇见你  微信公众号  Tags:分库分表   点击:(15)  评论:(0)  加入收藏
在 SQL 中写了 in 和 not in,技术总监说要炒了我……
WHY?IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢?1、效率低项目中遇到这么个情况:t1表 和 t2表 都是150w条数据,600M的样子,都不算大。但是这样一句查询 ↓select *...【详细内容】
2024-03-18  dbaplus社群    Tags:SQL   点击:(6)  评论:(0)  加入收藏
应对慢SQL的致胜法宝:7大实例剖析+优化原则
大促备战,最大的隐患项之一就是慢SQL,对于服务平稳运行带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什...【详细内容】
2024-03-14  京东云开发者    Tags:慢SQL   点击:(5)  评论:(0)  加入收藏
过去一年,我看到了数据库领域的十大发展趋势
作者 | 朱洁策划 | 李冬梅过去一年,行业信心跌至冰点2022 年中,红衫的一篇《适应与忍耐》的报告,对公司经营提出了预警,让各个公司保持现金流,重整团队,想办法增加盈利。这篇报告...【详细内容】
2024-03-12    InfoQ  Tags:数据库   点击:(32)  评论:(0)  加入收藏
SQL优化的七个方法,你会哪个?
一、插入数据优化 普通插入:在平时我们执行insert语句的时候,可能都是一条一条数据插入进去的,就像下面这样。INSERT INTO `department` VALUES(1, '研发部(RD)', &#39...【详细内容】
2024-03-07  程序员恰恰  微信公众号  Tags:SQL优化   点击:(20)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条