面试官:你真的认为ElasticSearch比MySQL快?

news/2024/8/27 15:47:55 标签: elasticsearch, mysql, 大数据

ElasticSearch(ES)的底层实现

  • 倒排索引(Inverted Index):通过文档中的关键词查找文档ID列表,适用于全文检索。
  • 正排索引(Forward Index):通过文档ID查找文档内容。
  • 实现细节
    • Term Index:存储Term前缀,快速定位Term Dictionary。
    • Term Dictionary:存储Term和指向Posting List的指针。
    • Posting List:存储与Term相关的文档ID列表。

MySQL的底层实现

  • InnoDB全文检索:支持全文检索,使用倒排索引。
  • 辅助表:包含wordilist字段,word字段上有索引,ilist包含(Document ID, Position)。
  • FTS Index Cache:红黑树结构的全文检索索引缓存,提高性能。

查询操作的实现

  • ES:使用倒排索引 + 正排索引机制,适用于复杂查询和全文检索。
  • MySQL
    • 使用B+ Tree索引或倒排索引查询记录ID。
    • 可能需要二次回表操作,除非使用覆盖索引。

性能比较

  • ES与MySQL的相似性:两者在查询实现上相似,都是通过索引查询记录ID,然后进行二次回表。
  • ES的优势:在全文检索性能上优于MySQL InnoDB。

业务场景分析

  • 复杂查询场景:面对千万量级数据和多个搜索条件,ES的“结果合并策略”(SkipList和Bitset)能更高效地处理多维复杂查询。
  • MySQL的局限性:联合索引需要遵循最左前缀原则,限制了多维复杂查询的索引覆盖。

MySQL 8的新特性

  • Skip Scan Range Access Method:在一定条件下可以不遵守最左前缀原则,利用范围扫描替代全表扫描。

结论

  • ES的优势:在处理大规模数据和复杂查询时,ES的性能通常优于MySQL。
  • 索引创建和查询优化:ES的索引创建和查询优化策略是其性能优势的关键。

http://www.niftyadmin.cn/n/5559037.html

相关文章

C语言基础 7. 函数

C语言基础 7. 函数 文章目录 C语言基础 7. 函数7.1. 初见函数7.2. 函数的定义和使用7.3. return7.4. 函数原型7.5. 参数传递7.6. 本地变量7.7. 函数庶事7.8. PAT07-0. 写出这个数 (20)07-1. 换个格式输出整数 (15)07-2. AB和C (15)07-3. 数素数 (20) 7.1. 初见函数 函数: 之前学…

W外链创建小红书私信卡片教程

在当今的社交媒体时代,小红书以其独特的社区属性和用户粘性,成为了许多品牌和个人展示自己、推广产品的重要平台。而在小红书上,一张精美且富有吸引力的卡片往往能够迅速吸引用户的注意,提高点击率和转化率。本文将详细介绍如何使…

一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取 点击注册🔗开通七牛开发者帐号如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key 2. Node.js获取七牛token 安装qiniu npm install qiniu创建空间 Node获取token const qi…

介绍 Elasticsearch 中的 Learning to Tank - 学习排名

作者:来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始,我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常,该模型用作第二…

Java面试题:MVCC

MVCC 保证事务的隔离性 排它锁: 一个事务获取了数据行的排他锁,其他事务就不能再获取该行的其他锁 MVCC: 多版本并发控制 维护一个数据的多个版本,使读写不存在冲突 具体实现依靠 隐藏字段 mysql中隐藏了三个隐藏字段 db_trx_id:最近修改事务 db_roll_ptr:指向上一个…

Spring Boot集成easyposter快速入门Demo

1.什么是easyposter? easyposter是一个简单的,便于扩展的绘制海报工具包 使用场景 在日常工作过程中,通常一些C端平台会伴随着海报生成与分享业务。因为随着移动互联网的迅猛发展,社交分享已成为我们日常生活的重要组成部分。海报分享作为…

并发编程01(并发编程入门)

预备知识: 什么是线程? 线程:当一个方法被调入栈,执行完出栈的过程就是一个线程 栈和队列都是由数组实现的,因为数组对于内存的消耗小 什么是进程? 凡是带有主方法,依赖自己的主方法运行起来的程序就是…

jmeter-beanshell学习8-for循环

一个稍微有点难度的东西 要把响应结果的所有名字都取出来,然后怎么处理看自己需求。比如找某个人是不是在这里,或者把所有人都写进一个文档,我就不编场景了 第一步想要取出所有名字,还得靠万能的正则表达式提取器,jso…