当前位置:首页 > 每日看点 > 正文内容

MySQL不香吗,为啥还要Elasticsearch?

卡卷网11个月前 (12-05)每日看点197

在技术面试中,遇到过这样一个有意思的场景,且听我娓娓道来。

面试官:“在你的系统里,都做过哪些性能优化,可以讲讲吗?”

候选人:“有些数据库查询检索类操作,我们用MySQL数据库会比较慢,所以全部挪到ElasticSearch(简称ES)中去做了,性能马上就提升了挺多。”

面试官:“为什么挪到ES里面性能就提升了,可以从技术原理上讲一讲吗?”

候选人:“因为ES用的是倒排索引啊,而MySQL用的是B+ Tree索引,前者的性能要快很多。”

面试官:“为什么倒排索引比B+ Tree索引快很多,可以从实现机制上讲讲吗?”

候选人:“这个。。。具体实现我就不清楚了。”

面试官:“那你真的认为ElasticSearch比MySQL快吗?”

候选人挠了挠头,说:“确实是快,但您这么一问,我确实答不上来ES到底快在哪里了。”

对话到此为止,下面我来回答一下这个问题。

首先,分享一套我自己逐字写的、深入浅出、细致易懂的高频面试题详解,旨在以一站式刷题 + 解惑的方式帮你提升学习效率,需要的请自取。

大厂Java高频面试题详解

强烈建议近期有求职诉求的Javaer好好看看。

ES的底层实现

先来介绍一下大家众所周知的ES特性 —— 倒排索引。

嗯,善于举一反三的同学看到“倒排索引”这四个字,马上就在想,与其相应对应的是不是“正排索引”?

没错儿,是的,这两个我一起介绍。

正排索引(Forward Index)的实现方式为,通过文档ID去查找整个文档内容,适用于全部文档遍历或根据某个文档ID查找内容的场景。

MySQL不香吗,为啥还要Elasticsearch?  第1张

倒排索引(Inverted Index)的实现方式,则是通过文档中的关键词去查找文档ID列表,这也就是其非常适用于全文检索的原因。

MySQL不香吗,为啥还要Elasticsearch?  第2张

这里面再补充一句,上图中的单词列,是通过ES的分词器按照一定的逻辑,将一段文本转换成一系列单词来实现的。

很多同学都认为ES是通过倒排索引来实现的查询检索,其实这种说法并不全面,而且倒排索引的结构也并非这么简单。

如下图所示:

MySQL不香吗,为啥还要Elasticsearch?  第3张

注:Term Index = 单词索引,Term Dictionary = 单词字典,Posting List = 倒排列表。

(1)当用户搜索“database”关键字的时候,会先通过以树结构(Burst-Trie)存储在内存中的Term Index中的“d”,查找到Term Dictionary中的“database”。

需要说明的是,Term Index不会存储完整的Term,仅仅存储Term的前缀来节省内存,通过Term Index可以快速地定位到Term Dictionary中的某个位置,再从这个位置再向后顺序查找。

打个比方,该步骤很像我们在上大学时候背的英语四六级字典,根据字母的顺序ABC在目录中查找到对应的单词。

(2)定位到Term Dictionary中的“database”关键字后,即可查找到Posting List中所对应的文档ID为3。

这个步骤就像根据目录中的单词,对应到其在字典中所对应的页数。

(3)再通过为3的文档ID,从ES的正排索引中查找到对应的数据信息“MySQL is a relational database”,并返回最终结果。

这个步骤就像我们最后翻到字典中某个页数,找到了对于该单词的详细解释,包括:音标、中文、例句等。

ES复杂查询的实现方式和全文检索比较类似,同样是用到了倒排索引 + 正排索引的实现机制。

假设有如下一张student表:

MySQL不香吗,为啥还要Elasticsearch?  第4张

当将该表中的数据保存到ES时,ES会为表中的每个字段都建立一个倒排索引。以name和age字段为例,如下图所示:

MySQL不香吗,为啥还要Elasticsearch?  第5张

接下来,我们看看具体的执行步骤。

MySQL不香吗,为啥还要Elasticsearch?  第6张

(1)当用户在name字段中查询“Mary”的时候,会先通过以树结构(Burst-Trie)存储在内存中的Term Index中的“M”,查找到Term Dictionary中的“Mary”。

(2)定位到Term Dictionary中的“Mary”关键字后,即可查找到Posting List中所对应的文档ID为3。

(3)再通过为3的文档ID,从ES的正排索引中查找到对应的数据列,并返回最终结果。


MySQL的底层实现

有一件出乎大家意料的事情,那就是MySQL InnoDB是支持全文检索的,并且其底层也是通过倒排索引来实现的。

在InnoDB中,倒排索引是通过full inverted index的方式来实现的,存放在全文检索的辅助表(Auxiliary Table)中。该表中有两个字段,word和ilist 字段,word字段上有设有索引,ilist中包含 (Documentld,Position)。

如下图所示:

MySQL不香吗,为啥还要Elasticsearch?  第7张

MySQL不香吗,为啥还要Elasticsearch?  第8张

btw:该截图来自于《MySQL技术内幕 —— InnoDB存储引擎》一书,表 5-8第一行中的“code”实为“cold”。

同样,InnoDB也提供了红黑树结构的FTS Index Cache(全文检索索引缓存)来提高性能。

由此来看,InnoDB的实现机制是不是跟ES的很像?但毕竟术业有专攻,ES在全文检索的性能上还是优于MySQL InnoDB的,在这里就不展开解释了。

但至少,“ES是通过倒排索引来实现的查询检索,而MySQL是通过B+ Tree来实现的”这句话,就显得不那么准确了。

说完了MySQL的全文检索,接下来我们说说MySQL是如何实现查询操作的,这个想必有很多同学都是清楚的。

如下图所示:

MySQL不香吗,为啥还要Elasticsearch?  第9张

一共分为两步,先通过name的二级索引树查询’Mary‘所对应的记录ID,拿到记录ID后去表记录索引树中查到对应的行记录。

照此看来,MySQL在查询上跟ES的实现方式也是大同小异的,无非是根据B+ Tree索引或倒排索引去查询对应的记录ID,然后再进行二次回表而已。

甚至MySQL如果可以用到覆盖索引,那连回表操作也都省去了,没准还比ES查询效率更高呢。

So,那ES真的比MySQL快吗?如何从底层实现原理的角度去说服面试官呢?

性能高的最大原因

假设有这样一个业务场景,如下图所示:


MySQL不香吗,为啥还要Elasticsearch?  第10张


在该场景下,不仅有千万量级的数据记录,多达二十几个的搜索条件,而且这些搜索项和返回的数据结果并不在一个数据表中,需要进行多表关联查询。

我们需要思考的一个问题是,如何给在这个场景下进行索引创建?

由于MySQL InnoDB的联合索引,很大程度上是要遵循最左前缀原则的,这就意味着在多维复杂查询的某些场景中,你需要通过(a,b,c),(a,c,b),(b,a,c),(b,c,a),(c,a,b),(c,b,a)这种排列组合创建联合索引的方式,保证用户的查询操作可以完全命中索引。

那上述业务场景中有20多个查询项的情况下,通过最左前缀原则、排列组合创建联合索引的方式一定是覆盖不全,况且都不在一个数据库表中,这是更加不可控的。

Btw:之所以在上文中用到了“很大程度上”,是因为MySQL 8引入了Skip Scan Range Access Method,它在一定条件下可以不遵守最左前缀原则,利用了范围扫描来替代了全表扫描的发生。

其实现原理为:MySQL隐式的构造了前缀查询条件,使一条查询就变成了多次查询,执行计划type = range。适用于最左条件区分度较低的情况,否则生成SQL过多,与全表扫描相比并无优势。

而该场景下,通过ES是可以轻松解决的,其实现机制是“结果合并策略”。

假设我们需要查出来姓名为lily,并且年龄为12岁的学生记录,如下图所示:

MySQL不香吗,为啥还要Elasticsearch?  第11张

MySQL不香吗,为啥还要Elasticsearch?  第12张

在ES中,支持SkipList和Bitset两种方式进行数据结果合并,前者是采用相互跳跃对比并得出合集的方式,后者则通过倒排列表的值计算出各自的Bitset,并进行AND操作合并。

通过该种方式,则可以轻松解决上述20多个查询项、千万量级数据记录的业务场景中,为其创建索引的问题。

我认为,这就是我们常说的ES比MySQL查询性能高的最大原因。

结语

洋洋洒洒地写了这么多,希望能在这道常见的技术面试题上,对同学们能够有所启发。

分享一套我自己逐字写的、深入浅出、细致易懂的高频面试题详解,旨在以一站式刷题 + 解惑的方式帮你提升学习效率,需要的请自取。

大厂Java高频面试题详解

强烈建议近期有求职诉求的Javaer好好看看。

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/12/3084.html

分享给朋友:

相关文章

个人站长为什么越来越少了?个人网站还能做吗?

个人站长为什么越来越少了?个人网站还能做吗?

在互联网快速发展的浪潮中,个人站长曾经有过辉煌的时代,但如今却面临着诸多困境,甚至走向 “死亡”。一、竞争激烈,难以立足如今的互联网行业,巨头林立,各大平台凭借着雄厚的资金、技术和资源优势,占据了绝大部分市场份额。无论是搜索引擎、社交媒体还...

感觉手机配置都差不多,为什么有的手机能卖2k-3k,而有的手机却能卖到6k-8k?

感觉手机配置都差不多,为什么有的手机能卖2k-3k,而有的手机却能卖到6k-8k?

与所有的商品一样,手机的价格,也是由它的成本所决定的。虽然看起来3000元的手机和6000的手机配置差不多,甚至处理器都可能是同一个,但在很多大家容易忽略的地方,决定了两者价格的不同:例如手机的外观,塑料的机身,与素皮机身和玻璃机身就完全不...

手机的运行内存真的有必要上16GB吗?

全是国产垃圾APP惯出来的。那些对国产软件没意见的人,建议出国看看,花不了多少钱,出门开 Google Map,订宾馆用 Booking,翻译用 Google translate,聊天用 Telegram,社交活动用 Discord,你会惊...

4499 元起的荣耀Magic7 系列实际使用体验怎么样,值得入手吗?

全是软文。。。。。。不过我买了,标准版。为什么买荣耀:屏幕看着舒服,玩游戏选择大屏,超声波指纹解锁。其它,系统、续航、充电、拍照,不是最强,但均衡下来短板都不是很短。其它米OV,IQ、一加,都看了,预算有限,米OV的小屏不感兴趣,OPPO硬...

有哪些网站,一旦知道,你就离不开了?

有哪些网站,一旦知道,你就离不开了?

这六个网站,一旦用过,基本上是离不开了。都是我超爱的一些网站,基本上每天都用。1 地图生成器第一个,我要给大家推荐的是地图生成器。可以下载到各省,各市,各县的svg格式的地图素材。这些素材导入PPT中都是可以编辑的。可以单独更改颜色和轮廓。...

只有我一个人后悔升级鸿蒙next吗?

只有我一个人后悔升级鸿蒙next吗?

我有一台mate 60 pro,第一时间升级了“纯血鸿蒙”。虽然功能并不完善,甚至有些简陋,但是我非常~非常不后悔升级鸿蒙next系统。因为.... 这就是一款“大型养成系游戏“,给我平淡的生活提供了源源不断的情绪价值。我每天特别...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。