什么时候考虑将mysql数据迁移到ES?

文章目录

  • 对ES的一些疑问
    • 问题1:ES相比mysql本身有哪些优势?
    • 问题2:哪些场景适合用ES而不是mysql?
    • 问题3:mysql逐行扫描,根据过滤条件检查记录中对应字段是否满足要求属于正排索引,根据二叉树索引检索记录的方式属于正排索引还是倒排索引
    • 问题4:对于简单数字字段,为什么不像mysql一样使用B+树作为索引
  • 一些概念
    • 1、倒排索引
    • 2、BKD树

在模糊的影响中,ES查询效率高,尤其是最近组内在推慢sql治理,看到有些单张表已经存在索引数量近10个,表中字段确实比较多,一种治理方式是宽表拆分多个表,降低每个表查询的字段,每个表需要创建和维护索引数量也会降低。也在考虑是不是可以将数据同步到ES,部分查询场景走ES,宽表拆分导致数据比较分散,更新和查询起来更麻烦,使用ES数据完整性可以保证,相同数据使用不同的存储介质进行存储,更新和维护相比来说更简单。这里不仅自问,增加mysql从库从库数量,降低查询压力不行吗,同样的数据同步到ES查询,查询效率就会显著提升吗?

对ES的一些疑问

问题1:ES相比mysql本身有哪些优势?

1、ES会在所有字段上创建索引。
首先对于mysql中的数据同步到ES之后,会以JSON对象的形式进行存储,mysql中一行记录对应ES中一个文档。索引字段都会被索引,对于文本和keyword字段会使用进行分词、然后采用建立倒排索引,对于数值、日期等其它类型字段使用不同的数据结构和索引技术,例如对于数值和地理位置数据使用BKD树。

2、水平扩展。
当数据量增加时,可以通过增加结点实现自动水平扩容,而mysql要实现水平扩容,往往需要手动操作,复杂度较大。

3、分布式检索和并行处理。
ES天然将数据分片存储,并行查询时将每个分片上结果合并处理,mysql虽然也支持分库分表,但分库分表全部扫描效率相对较慢。

4、ES支持对文本进行全文检索,比mysql的模糊查询要快。
例如现在有一个用户表,其中包含一个个人简介profile字段,并且该表数据同步一份到了ES,二者要查询喜欢唱歌的人,查询方式分别如下,
对于Mysql,使用的是子字符串匹配算法:
SELECT * FROM users WHERE profile LIKE ‘%唱歌%’;
对于ES,使用倒排索引,显而易见,效率更高:
GET /users/_search
{
“query”: {
“match”: {
“profile”: “唱歌”
}
}
}

问题2:哪些场景适合用ES而不是mysql?

场景mysql效率ES查询效率优先选择
简单数字类型,数量不多高,mysql使用起来更简单,可视化效果更好高,虽然也支持高效查询,感觉不是很有必要,相比mysql更重mysql
简单数字类型,数量很多通过建立索引和分库分表依然可以胜任,但是维护和查询复杂度会增高,水平分库分表可以降低每个表的数据量,垂直分表可以减少单个表字段,提高单表查询效率,跨表查询将变得复杂,mysql写入高,对于实时写入场景要求高场景可以继续使用mysql分布式扩展和并行查询,大数量查询效率高,并且天然支持水平扩展,写入效率没有mysql高,对于做聚合分析效率高,一般也会同步一份数据到ES,负责一些非实时的查询mysql和ES同时使用
包含大文本低,尤其模糊查询高,使用了倒排索引ES

问题3:mysql逐行扫描,根据过滤条件检查记录中对应字段是否满足要求属于正排索引,根据二叉树索引检索记录的方式属于正排索引还是倒排索引

B+树非叶子结点存储记录中某一列的值,叶子结点存储记录的id,倒排索引是根据某个词查询出所在的所有文档列表,二者虽然都是从记录中某个值查询整个记录的信息所在位置(唯一文档标识或者记录逐渐),但是二者一个是查询出一条记录,一个是查询出这个单词出现的所有文档列表,差别还是很大的,一个用于大文本,一个用户非大文本,专门解决的场景也不一样。

问题4:对于简单数字字段,为什么不像mysql一样使用B+树作为索引

首先从ES的定位来说,ES是为了提高多字段联合查询,虽然在多个字段上使用B+树创建联合索引,但是其实是将多个字段顺序化,但其实在相近的数据,在空间上往往距离也很近,对于B+树没有保留数据的空间信息,查询效率不是很高,而是使用使用了保留数据空间特征的BKD-Tree作为索引。
基于B+树创建的联合索引。
如下图所示,创建和查询都是优先表第一列,只有第一列相同才会比较第二列,这样多维数据在逻辑上就变成了一维。
在这里插入图片描述

对于BKD树,在创建索引,每层会依次按照k个纬度交替轮流进行划分,这样不用等第一维值全部检索完才能利用后面纬度数据进行数据查找,如下图依次是二维和三维BKD树的的示意图,对于二维BKD树,奇数层次按照第一维度划分,偶数层次按照第二维进行划分,依次交替。
在这里插入图片描述
在这里插入图片描述

一些概念

1、倒排索引

倒排索引,也成为方向索引,是一种常用在文档检索系统中的索引方法,包含两种形式,第一种,反向文档索引一条记录的水平反向索引,包含每个单词所在文档列表;第二种,完全反向索引一个单词的水平反向索引,包含每个单词在一个文档中位置。三条记录,举例说明,:
T0=“what is banann”
T1= “it is what is it”
T2=“it is a banana”
反向文档索引:
“a” : {2}
“banana”: {0,2}
“is” :{0,1,2}
“it”:{1,2}
“what”:{0,1}
完全反向索引:
“a” : {(2,2)}
“banana”: {(2,3)}
“is” :{(0,1),(1,1),(1,3),(2,1)}
“it”:{(1,0),(1,4),(2,0)}
“what”:{(0,0),()1,2}
比如查询条件为“What”, “is”, “it”,计算每个关键词出现的文档取交集{0,1}∩{0,1,2}∩{1,2}={2},使用完全反向索引同理,只会对文档位置取交集,例子三条记录是正向索引,根据文档id,检索每个文档包含的内容。

2、BKD树

BKD树全称为Block-K-dimension Tree,是多维树(K-dimension Tree,KD-Tree)的改良版本,改善了内存利用率和更好的查询效率,多用于多维数据搜索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/42328.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合DataX数据同步(自动生成job文件)

SpringBoot整合Datax数据同步 文章目录 SpringBoot整合Datax数据同步1.简介设计理念 DataX3.0框架设计DataX3.0核心架构核心模块介绍DataX调度流程 2.DataX3.0插件体系3.数据同步1.编写job的json文件2.进入bin目录下,执行文件 4.SpringBoot整合DataX生成Job文件并执…

生产力工具|VS Code安装及使用指南

一、VS Code介绍 (一)软件介绍 Visual Studio Code(简称VS Code)是由Microsoft开发的免费开源代码编辑器,适用于Windows、macOS和Linux操作系统。它支持多种编程语言,如JavaScript、Python、C等&#xff0…

知识社区在线提问小程序模板源码

蓝色的知识问答,问答交流,知识社区,在线提问手机app小程序网页模板。包含:社区主页、提问、我的、绑定手机,实名认证等。 知识社区在线提问小程序模板源码

品质至上!中国星坤连接器的发展之道!

在电子连接技术领域,中国星坤以其卓越的创新能力和对品质的不懈追求,赢得了业界的广泛认可。凭借在高精度连接器设计和制造上的领先地位,星坤不仅获得了多项实用新型专利,更通过一系列国际质量管理体系认证,彰显了其产…

【Qt5.12.9】程序无法显示照片问题(已解决)

问题记录:Qt5.12.9下无法显示照片 我的工程名为03_qpainter,照片cd.png存放在工程目录下的image文件夹中。 /03_qpainter/image/cd.png 因为这是正点原子Linux下Qt书籍中的例程,在通过学习其配套的例程中的项目,发现我的项目少…

【Python】搭建属于自己 AI 机器人

目录 前言 1 准备工作 1.1 环境搭建 1.2 获取 API KEY 2 写代码 2.1 引用库 2.2 创建用户 2.3 创建对话 2.4 输出内容 2.5 调试 2.6 全部代码 2.7 简短的总结 3 优化代码 3.1 规范代码 3.1.1 引用库 3.1.2 创建提示词 3.1.3 创建模型 3.1.4 规范输出&#xf…

西门子1200高速计数器编码器的应用 接线 组态 编程 调试 测距测速

编码器的应用、接线、组态、博途1200编程与调试:高速计数器,用于给PLC发高速脉冲,接I点 用来例如:检测电机转速,皮带输送机运行的距离 (粗略定位) 360:代表转一圈会对外发360个脉冲&…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1,Vue3.NET6前后端分离式管理后台实战(二十八)

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致(Inconsistent)状态 2.2.日志式文件系统(Journaling filesystem) 3.Linux文件系统的运行 4、文件的删…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球,获取上万份PPT/WORD解决方案!!!感谢支持!!!

【C++】string的底层原理及实现

文章目录 string类的存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作size()capacity()reserve()resize()clear() 遍历与访问operator[ ]迭代器范围与for 增删查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成员函数op…

力扣考研经典题 反转链表

核心思想 头插法: 不断的将cur指针所指向的节点放到头节点之前,然后头节点指向cur节点,因为最后返回的是head.next 。 解题思路 1.如果头节点是空的,或者是只有一个节点,只需要返回head节点即可。 if (head null …

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域,并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大,从而直观展示数据的集中程度和分布模式。热…

半同步主从复制

半同步主从复制的概念 半同步主从复制(Semisynchronous Replication, SBR)是MySQL数据库中的一种数据复制方式,它在异步复制的基础上增加了一定程度的同步性,旨在提高数据安全性,减少数据丢失的风险。 半同步主从复制…

阶段三:项目开发---大数据开发运行环境搭建:任务8:安装配置Redis

任务描述 知识点:安装配置Redis 重 点: 安装配置Redis 难 点:无 内 容: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可…

电路基础知识汇总

1.0 串连,并联,混连 串联的定义 电路串联是一种电路元件的连接方式,其中各个元件沿着单一路径互相连接,形成一个连续的链。在串联电路中,每个节点最多只连接两个元件,这意味着电流只有一条路径可以通过整个…

Apache Seata Mac下的Seata Demo环境搭建

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Mac下的Seata Demo环境搭建(AT模式) 前言 最近因为工作需要&#xf…

Git教程

文章目录 Git分布式版本控制工具版本控制器的方式常用命令远程仓库Tip Git分布式版本控制工具 ​ Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 ​ Git是分布式的,Git不需要有中心服务器,我们每…

【感谢告知】本账号内容调整,聚焦于Google账号和产品的使用经验和问题案例分析

亲爱的各位朋友: 感谢您对本账号的关注和支持! 基于对朋友们需求的分析和个人兴趣的转变,该账号从今天将对内容做一些调整,有原来的内容改为Google(谷歌)账号和产品的使用经验,以及相关问题的…