数据库为什么不适合搜索引擎的底层存储?

原创不易,转载请标明地址,或者直接附上我的博客首页https://georgedage.blog.csdn.net/
文中有些并没有解释过于清楚,本篇更适合有基础的同学阅读,思考,思考,思考。

千亿级实时搜索,要满足的条件

》高并发,要能支持百万级以上的并发
》实时性,响应时间不超过3秒

那么我们考虑,这样的情况下,使用数据库是否可以?

Mysql / pgsql / db2 / Oracle

首先先说出我们的结论,那就是不可以,那么为什么呢?请听我细细给你叨唠,本篇博客通过由浅入深,并且根据一个个问题去探讨,或许你看完之后会有一点想法,不过如果有不妥之处,欢迎指出。

我们经常浏览博客,新闻,商品等,存储这些数据的表应当具有什么样的字段呢?

表字段

提出问题:

在数据库中如何做到下面的查询?以新闻表为例

查询

或许对于稍微掌握点数据库知识的同僚们,这些都不是问题!
那么,请看问题二!

当数据量变大时,这四个查询都变慢了,该如何优化?

我们都知道,数据库的常用数据库优化方法为:
》建索引
》分区表

由此提出问题三。

建索引对“查询标题与钓鱼岛有关的新闻”和“查询与苍老师有 关的新闻”有效果吗?

或许对索引有点基本概念的同僚们,会想,没关系呀。
嗯,好,那我问你,为什么呢?
(⊙o⊙)…(⊙o⊙)…(⊙o⊙)…
所以我们需要理解索引的原理是什么?

索引的原理是什么

即: 对列值创建排序存储,数据结构={列值、行地址}。在有序数据列表中就可以利用二分查找快速找到要查找的行的地址,再根据地址直接取行数据。

或许这样看会有点抽象,这里我们可以补充一下自己的基础知识,当然也是面试中经常问到的。

数组,链表,树,二叉树,红黑树,mysql的b+tree


在这里插入图片描述

对于b+tree:


在这里插入图片描述

b+tree,叶子存储数据,节点关键值

这里补充一道面试题:大剑无锋之简单说一下聚簇索引和非聚簇索引?【面试推荐】

然后根据索引的原理进一步思考索引!

索引的排序,是怎么排的?

》数值列
》时间列
》文本列

这里相信学过语言基础的都知道,编码字符集的应用。
就像汉字,在计算机中的存储也是二进制,所以也就是我们常说的字典序。详细这里不做过多的阐述。

在新闻标题列上建索引,当我们查询标题=‘钓鱼岛’ ,数据库会怎么去查?

在这里插入图片描述

但是我们查询的是这样一个字段呢?
或者说数据库中有这样一个字段,“中国拥有钓鱼岛”
如果走索引,这个是会被忽视的查询不到,所以需要全局进行查询。

【补充】这里我在网上看到有说到覆盖索引可以解决类似问题,不过这个我并没有进行研究呢,后续补上!

如果要对查询出来的结果进行相关度排名,数据库能否做到?

在这里插入图片描述

如果要对搜索的新闻字段设置不同的权重,比如新闻标题中包含这三个关键字的新闻的
相关性就远高于新闻内容中包含这三个字。数据库能否做到?

最后我们得出结论

结论:
数据库适合结构化数据的精确查询,而不适合半结构化、非结构化数据的模糊查询及灵活搜索(特别是数据量大时),无法提供想要的实时性。

【补充】


在这里插入图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 面试题5:union all 和 union的区别 Union:对两个结果集进行并集操作,不包括重复行,同时进行默...
    行者和他的钢笔阅读 1,048评论 0 1
  • 数据库的基本是概念名词解释: 数据库名词解释 元组:可以理解为表的每一行就是一个元组 候选码:若关系中的某一属性组...
    杰伦哎呦哎呦阅读 1,236评论 0 6
  • 春节假期和妈妈、妹妹、小婉巡山。发现家附近别墅区废弃的游乐园。在山坡上可以看见三岔湖的一湾湖水,有阳光️,微风,我...
    哈哈小石头阅读 498评论 0 1
  • 做了蹩脚的狗就要放下尾巴,低头哈腰,无心做狗,求得别人可怜和依然高傲自大都是不对的,所以存在很难!
    哈囉朱文軒阅读 265评论 0 2

友情链接更多精彩内容