当前位置: 首页 > news >正文

20250214 随笔 Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写

Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写的区别、优缺点分析

在高并发数据查询场景下,Elasticsearch(ES)业务数据库冗余双写 都是常见的数据同步方案。它们主要区别在于数据存储方式、查询性能、数据一致性和运维复杂度


1. ES 与 冗余双写的核心区别

对比点Elasticsearch(ES)索引方案业务数据库冗余双写
核心理念数据存入数据库,同时索引到 ES,用于高性能搜索在数据库表之间冗余存储相同数据,减少查询 JOIN 依赖
存储方式数据库(持久化)+ ES(搜索引擎)数据库表内部冗余存储
查询性能适用于复杂查询、模糊匹配、全文检索,速度快适用于结构化数据查询、关系型查询
数据一致性最终一致性(可能会有延迟)事务保证强一致性
适用场景搜索、日志分析、推荐系统、全文检索业务数据表避免 JOIN,提升查询性能

2. 方案一:使用 Elasticsearch(ES)索引数据

✅ 优势

  1. 高效搜索

    • ES 采用倒排索引,擅长 模糊查询、全文检索、复杂过滤、聚合分析
    • 比数据库 LIKE 查询快很多(数据库 LIKE %xxx% 查询效率低)。
  2. 查询速度快,支持大规模数据量

    • 适合海量数据查询,大数据场景(日志系统、推荐系统等)。
    • 支持高并发查询,而数据库查询在高并发下压力大。
  3. 支持复杂查询

    • 适用于 全文检索、模糊查询、聚合计算,而数据库不擅长这些操作。

❌ 缺点

  1. 数据一致性问题(最终一致性)

    • 数据库和 ES 可能不同步,因为数据存入数据库后需要同步到 ES,可能会有延迟数据丢失(同步失败)。
    • 写入不保证事务一致性,可能导致查询结果和数据库数据不一致。
  2. 运维成本高

    • ES 需要额外的服务器资源,包括 CPU、内存、磁盘(ES 需要 SSD 磁盘)。
    • 需要维护索引结构,数据量大时可能需要索引优化
  3. ES 需要定期重建索引

    • 如果数据变化频繁,ES 索引会碎片化,需要重新索引优化查询效率。

3. 方案二:业务数据库冗余双写

✅ 优势

  1. 事务一致性

    • 数据库保证强一致性,冗余数据和原数据同步写入,不会有数据不同步问题。
  2. 无额外系统依赖

    • 不需要额外的搜索引擎(如 ES),数据库内完成查询。
    • 运维简单,不需要维护 ES。
  3. 查询优化

    • 避免跨表 JOIN 查询,提高数据库查询性能。例如:
      • 订单表 (orders) 可能冗余存储用户昵称 (user_name),避免关联 users 表查询。

❌ 缺点

  1. 数据冗余,占用存储

    • 同一份数据可能存入多个表,增加存储开销
    • 需要定期清理、更新冗余字段,否则可能带来数据同步压力。
  2. 数据库写入性能下降

    • 双写增加了写入压力,每次更新数据时,需要更新多个表
    • 如果更新涉及多个冗余字段,会导致 UPDATE 操作增多,影响性能。
  3. 不支持复杂查询(如全文检索)

    • 不适合模糊搜索、全文检索、复杂过滤,这些场景ES 更擅长

4. 使用 ES 还是 冗余双写?如何选择?

场景推荐方案原因
模糊查询、全文检索ESES 支持倒排索引,查询速度快,LIKE 查询在数据库中效率低
高并发查询ESES 支持分布式查询,适合大数据查询
数据库 JOIN 查询性能低冗余双写避免跨表 JOIN,减少查询压力
实时性要求高,数据不能不同步冗余双写数据强一致性
日志分析、推荐系统、报表ES适合大规模数据计算
数据库运维成本低,避免额外服务冗余双写只需数据库,不需要额外搜索引擎

5. 混合方案(ES + 冗余双写)

💡 实际业务中,我们通常会结合 ES 和数据库冗余双写,让两者互补!

  1. 查询使用 ES,加速搜索
    • 业务查询走 ES,提高查询效率。
  2. 核心业务数据用数据库(保证事务)
    • 订单、支付等核心数据仍存数据库,保持一致性。
  3. ES 和数据库保持同步
    • 通过 Flink + KafkaBinlog 监听,将数据库变更数据同步到 ES。

6. 结论

  • Elasticsearch 适用于全文搜索、模糊查询、高并发读,但有数据同步问题。
  • 业务数据库冗余双写适用于减少数据库 JOIN,提高事务一致性,但存储冗余、写入性能下降。
  • 混合方案(ES + 数据库)适用于大多数企业应用,利用 ES 提升搜索性能,同时数据库保证事务一致性。

💡 如果你的业务涉及搜索优化,建议引入 ES;如果是高并发结构化数据查询,可以优先考虑数据库冗余双写! 🚀

相关文章:

20250214 随笔 Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写

Elasticsearch(ES)索引数据 vs. 业务数据库冗余双写的区别、优缺点分析 在高并发数据查询场景下,Elasticsearch(ES) 和 业务数据库冗余双写 都是常见的数据同步方案。它们主要区别在于数据存储方式、查询性能、数据一…...

c# textbox 设置不获取光标

[DllImport("user32",EntryPoint "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); //需引入命名空间using System.Runtime.InteropServices; private void Txt_RecInfo_MouseDown(object sender, MouseEventArgs e) { …...

中望CAD c#二次开发 ——VS环境配置

新建类库项目&#xff1a;下一步 下一步 下一步&#xff1a; 或直接&#xff1a; 改为&#xff1a; <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...

anolis os 8.9安装jenkins

一、系统版本 # cat /etc/anolis-release Anolis OS release 8.9 二、安装 # dnf install -y epel-release # wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo # rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.…...

HtmlRAG:RAG系统中,HTML比纯文本效果更好

HtmlRAG 方法通过使用 HTML 而不是纯文本来增强 RAG 系统中的知识表示能力。通过 HTML 清洗和两步块树修剪方法&#xff0c;在保持关键信息的同时缩短了 HTML 文档的长度。这种方法优于现有基于纯文本的RAG的性能。 方法 其实主要看下围绕html提纯思路&#xff0c;将提纯后的…...

TypeScript 中的 reduce计算统计之和

1、计算字符串数组中最大的一项&#xff0c;比如数组&#xff1a;list ["家长会,柘城,喝士大夫","模压,手动阀,阿斯蒂"]&#xff0c;求出list中字符串长度之和最大的那项&#xff1a; // 初始化变量来存储字数之和最多的项及其字数之和let maxWord ;let…...

HTTP/2 由来及特性

HTTP/2 的由来 HTTP/1.x 的局限性 性能瓶颈 队头阻塞问题&#xff1a;在HTTP/1.x中&#xff0c;一个TCP连接在同一时间只能处理一个请求&#xff0c;后续请求必须等待前面的请求处理完成并收到响应后才能被处理。例如&#xff0c;当一个页面有多个资源&#xff08;如图片、脚…...

android 安装第三方apk自动赋予运行时权限

摘要&#xff1a;行业机使用场景点击运行时权限很麻烦&#xff0c;而随着android的演进&#xff0c;对于权限的管控越发严格。故本文通过对系统的修改实现第三方app在运行时直接获取全部权限。 通过属性ro.perms.force_grant控制功能开关。 Index: frameworks/base/services/…...

PyTorch Lightning LightningDataModule 介绍

LightningDataModule 是 PyTorch Lightning 提供的数据模块,用于统一管理数据加载流程(包括数据准备、预处理、拆分、批量加载等)。它的核心作用是将数据处理逻辑与模型解耦,提高代码的可复用性和可读性。 1. LightningDataModule 的作用 ✅ 封装数据预处理:数据下载、清…...

windows平台上 oracle简单操作手册

一 环境描述 Oracle 11g单机环境 二 基本操作 2.1 数据库的启动与停止 启动: C:\Users\Administrator>sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on 星期五 7月 31 12:19:51 2020 Copyright (c) 1982, 2013, Oracle. All rights reserved. 连接到:…...

【网络安全 | 漏洞挖掘】价值3133美元的Google IDOR

未经许可,不得转载。 文章目录 正文正文 目标URL:REDACTED.google.com。 为了深入了解其功能,我查阅了 developer.google.com 上的相关文档,并开始进行测试。 在测试过程中,我发现了一个 XSS 漏洞,但它触发的域名是经过正确沙盒化的 *.googleusercontent.com,这符合 …...

LabVIEW太阳能制冷监控系统

在全球能源需求日益增长的背景下&#xff0c;太阳能作为一种无限再生能源&#xff0c;被广泛应用于各种能源系统中。本基于LabVIEW软件和STM32F105控制器的太阳能制冷监控系统的设计与实现&#xff0c;提供一个高效、经济的太阳能利用方案&#xff0c;以应对能源消耗的挑战。 项…...

10.2 Git 内部原理 - Git 对象

Git 对象 Git 是一个内容寻址文件系统&#xff0c;听起来很酷。但这是什么意思呢&#xff1f; 这意味着&#xff0c;Git 的核心部分是一个简单的键值对数据库&#xff08;key-value data store&#xff09;。 你可以向 Git 仓库中插入任意类型的内容&#xff0c;它会返回一个唯…...

作业。。。。。

顺序表按元素删除 参数&#xff1a;删除元素&#xff0c;顺序表 1.调用元素查找的函数 4.根据下表删除 delete_sub(list,sub); //删除元素 void delete_element(int element, Sqlist *list) …...

android 的抓包工具

charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求&#xff1a; 1.启动代理&#xff1a; 2.设置设备端口 3.手机连接当前代理 …...

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…...

linux中top命令详解

linux中top命令详解 top 是 Linux 中用于实时监控系统资源使用情况的命令&#xff0c;显示包括 CPU、内存、进程等信息的动态视图。以下是 top 命令的详细说明&#xff1a; 命令格式 top [选项] 常用选项 -d&#xff1a;设置刷新间隔时间&#xff08;秒&#xff09;。 -n&am…...

前端包管理器的发展以及Npm、Yarn和Pnpm对比

在现代前端开发中&#xff0c;包管理器是不可或缺的核心工具。随着 JavaScript 生态的快速发展&#xff0c;开发者经历了从 npm 一统天下到 Yarn 挑战格局&#xff0c;再到 pnpm 创新突破的技术演进。这里将对三种主流包管理器&#xff08;npm/Yarn/pnpm&#xff09;进行全方位…...

node.js+兰空图床实现随机图

之前博客一直用的公共的随机图API&#xff0c;虽然图片的质量都挺不错的&#xff0c;但是稳定性都比较一般&#xff0c;遂打算使用之前部署的兰空图床&#xff0c;自己弄一个随机图 本文章服务器操作基于雨云——新一代云服务提供商的云服务器进行操作&#xff0c;有兴趣的话可…...

【MySQL】高频 SQL 50 题(基础版)

高频SQL50题&#xff08;基础版&#xff09; 1.查询 2.连接 MySQL多表查询&#xff08;联合查询、连接查询、子查询&#xff09; left join 左连接 我们首先执行LEFT JOIN操作&#xff0c;将两个表的数据基于 id 列进行组合。同样&#xff0c;我们使用 LEFT JOIN 来确保将所…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...