02查询分离:表数据量大查询缓慢如何优化?

查询分离定义

每次写数据时保存一份数据到另外的存储系统里,用户查询数据时直接从另外的存储系统里获取数据

什么时候使用

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

查询分离实现思路

(一)如何触发查询分离?

分为3种

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

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

(3) 监控数据库日志:如有数据变更,更新查询数据。

image.png

(二)如何实现查询分离?

这里主要讲解第二种

修改业务代码异步建立查询数据,最基本的实现方式是单独起一个线程建立查询数据,不过这种做法会出现如下情况:

  • 写操作较多且线程太多,最终撑爆 JVM;
  • 建查询数据的线程出错了,如何自动重试
  • 多线程并发时,很多并发场景需要解决。

此时使用 MQ 管理这些线程即可解决

image.png

(三)查询数据如何存储?

市面上主要使用 Elasticsearch 实现大数据量的搜索查询,当然还可能会使用到 MongoDB、HBase 这些技术

(四)查询数据如何使用?

因 ES 自带 API,所以使用查询数据时,我们在查询业务代码中直接调用 ES 的 API 就行。

整体方案

image.png

有用的话打赏一下?👇

评论