为何页面搜索应避免左模糊和全模糊查询???

news2024/12/26 0:52:57
前言

在构建高效且可扩展的Web应用程序时,数据库查询的性能是影响用户体验的关键因素之一。特别是对于涉及大量数据的页面搜索功能,选择正确的查询方式不仅可以提升应用的速度,还能显著改善用户交互体验。

B-Tree索引与最左前缀匹配特性
1. B-Tree 索引基础

B-Tree(或其变体如B+Tree、B*Tree等)是一种自平衡树形数据结构,广泛应用于关系型数据库系统(RDBMS)中作为索引机制。它支持快速插入、删除和查找操作,同时保证了良好的空间利用率。B-Tree的一个重要特性是最左前缀匹配,这意味着:

  • 最左前缀原则:当索引字段由多个部分组成时(例如,复合索引),查询条件必须从最左边的部分开始。如果查询条件不满足这个原则,则该索引可能无法被有效利用。

  • 索引扫描效率:由于B-Tree索引是从根节点到叶子节点逐层向下查找,因此它非常适合处理以特定前缀开头的查询(即右模糊查询 LIKE 'keyword%')。然而,对于左模糊查询或全模糊查询,因为需要检查所有可能的路径,所以会退化为全表扫描,极大地降低了查询效率。

2. 复合索引与最左前缀原则

复合索引是由多个字段组成的索引,它可以提高多列组合查询的性能。根据最左前缀原则,复合索引中的每一列都必须按照定义顺序出现在查询条件中,否则索引将不会被完全利用。例如,如果你有一个复合索引 (column1, column2),那么查询条件至少应该包含 column1 的值,才能充分利用此索引。

左模糊与全模糊查询的问题详述
1. 左模糊查询 (LIKE '%keyword')
  • 索引失效:左模糊查询要求数据库引擎遍历整个索引树来查找所有可能包含关键词的数据记录,导致索引失去作用,进而使查询变为全表扫描,增加了I/O成本。

  • 内存消耗:全表扫描意味着更多的数据页会被加载到内存中,这不仅增加了内存占用,还可能导致缓存污染,影响其他查询的性能。

  • CPU资源浪费:每次执行这样的查询都会产生大量的CPU计算,尤其是在高并发环境下,会对服务器造成较大压力。

2. 全模糊查询 (LIKE '%keyword%')

除了上述左模糊查询的所有问题外,全模糊查询还带来了额外的挑战:

  • 中间匹配难度大:对于出现在字符串中间位置的关键词,数据库需要进行更加复杂的字符串处理,进一步降低了查询速度。

  • 结果集过大:由于没有明确的边界限制,查询可能会返回过多的结果,增加网络传输量和前端渲染时间。

替代方案与最佳实践

为了提高搜索功能的性能,以下是几种推荐的替代方案及最佳实践:

1. 使用全文搜索引擎

引入Elasticsearch、Solr等专门设计的全文搜索引擎,可以有效解决复杂文本检索的需求。这些工具不仅支持基本的模糊匹配,还提供了以下高级功能:

  • 分词器:能够根据语言规则对输入文本进行分割,从而提高匹配准确性。

  • 权重评分:基于相关性对搜索结果进行排序,确保最重要或最相关的文档优先展示给用户。

  • 近似匹配:允许一定程度上的拼写错误或变形词识别,增强用户体验。

  • 实时更新:通过增量索引等方式实现实时数据同步,保持搜索结果的新鲜度。

2. 调整查询策略

尽量使用右模糊查询或其他形式的精确匹配查询,以便充分利用现有索引的优势。此外,考虑以下方法优化查询逻辑:

  • 多条件组合:结合其他字段进行组合查询,通过多条件筛选减少结果集规模,降低单个查询的复杂度。

  • 范围查询:利用日期、数值等类型字段设置合理的查询范围,进一步缩小搜索空间。

  • 预过滤:先用简单的条件过滤出一部分数据,再在其基础上做更细致的模糊匹配,这样可以在不影响最终结果的前提下减少不必要的计算。

3. 预计算与缓存

对于频繁访问但变化不大的数据,可以通过预计算和缓存机制提前生成搜索结果,减轻实时查询的压力:

  • 静态内容缓存:对于完全不变的内容,可以直接存储HTML片段或JSON响应,直接返回给客户端,无需再次查询数据库。

  • 动态内容缓存:针对变化频率较低的数据,可以设定较短的有效期,在此期间内重复使用相同的查询结果。

  • 分布式缓存系统:使用Redis、Memcached等分布式缓存解决方案,不仅可以加速数据读取,还可以分散热点数据的压力,提高系统的整体稳定性。

4. 数据库层面的优化

除了调整应用逻辑外,还可以从数据库内部着手,采取一些优化措施:

  • 创建覆盖索引:确保索引包含了查询所需的所有列,使得查询可以直接从索引中获取完整信息,而不需要回表查询。

  • 分区表:对于特别大的表,可以根据业务特点对其进行水平或垂直分区,减少每次查询的数据量。

  • 定期维护索引:随着数据的增长,索引可能会变得臃肿或碎片化,定期重建或优化索引有助于保持其高效性。

  • 选择合适的索引类型:不同类型的索引适用于不同的场景,例如哈希索引适合等值查询,全文索引适合文本检索。了解并选择最适合你需求的索引类型可以大幅提升查询性能。

拓展
1. 查询优化器的作用

现代数据库管理系统通常配备有查询优化器,这是一个复杂的组件,负责分析SQL语句并选择最优的执行计划。理解查询优化器的工作原理可以帮助开发者编写更高效的SQL语句,并通过EXPLAIN等工具查看执行计划,找出潜在的性能瓶颈。

2. 并发控制与锁机制

在高并发环境下,合理地管理事务和锁定机制至关重要。不当的锁使用会导致死锁或长等待现象,严重影响系统性能。学习如何最小化锁争用,例如采用乐观锁或无锁编程技术,可以显著提高数据库的并发处理能力。

3. 数据压缩与存储优化

对于大规模数据集,有效的数据压缩和存储格式优化也是不容忽视的一环。通过选择合适的数据类型、压缩算法和存储引擎,可以在不影响数据完整性的情况下节省大量磁盘空间,并加快数据读取速度。

4. 实时数据分析与流处理

随着大数据时代的到来,越来越多的应用需要支持实时数据分析和流处理。Apache Kafka、Flink、Spark Streaming等框架提供了强大的实时数据处理能力,结合全文搜索引擎,可以实现近乎即时的搜索结果更新。

结语

综上所述,虽然左模糊和全模糊查询看似提供了灵活的搜索选项,但从长远来看,它们往往会给数据库带来不必要的负担。

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

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

相关文章

国标GB28181公网直播EasyGBS与国标GB28181协议融合,助力应急救援指挥无线视频监控系统建设

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中,国标GB28181协议以其强大的功能和广泛的应用场景,成为了公共安全视频监控联网系统的核心标准。 应急救援指挥系统要求能够迅速响应各…

VisionPro开发使用交互反馈系统(Affordance System)

XR Interaction Toolkit 提供了一个affordance system 可供性系统,使用户能够创建对交互状态的视觉和听觉反馈。一般的信息流从向Affordance State Provider场景中添加一个(通常是可交互的)并将其指向我们要监视其交互状态的可交互对象开始。…

SpringCloud 入门(4)—— 网关

上一篇:SpringCloud 入门(3)—— Nacos配置中心-CSDN博客 Spring Cloud Gateway 作为 Spring Cloud 生态系统的一部分,主要在微服务架构中充当 API 网关的角色。它提供了统一的入口点来处理所有的 HTTP 请求,并将这些请…

在linux系统的docker中安装GitLab

一、安装GitLab: 在安装了docker之后就是下载安装GitLab了,在linux系统中输入命令:docker search gitlab就可以看到很多项目,一般安装第一个,它是英文版的,如果英文不好可以安装twang2218/gitlab-ce-zh。 …

vscode打开下一个文件的时候上一个文件会关闭

解决方法: 你可以通过设置 workbench.editor.enablePreview 来控制在 VS Code 中打开文件时是否会关闭上一个文件。将其设置为 false 可以防止这种行为。 {"workbench.editor.enablePreview": false } 在设置编辑器中显示 "workbench.editor.enab…

PostgreSQL编译安装教程

下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…

访谈积鼎科技总经理:国产CFD软件发展与未来趋势展望

傅彦国,上海积鼎信息科技有限公司创始人 记者:请傅总介绍下我国流体仿真行业的发展现状是怎样的? 傅彦国:自2018年政府加大了对核心技术自主研发的支持力度,国产CFD软件逐渐步入发展正轨。 首先,从市场规…

重温设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型:代理模式涉及的主要角色有:C 代码示例 定义 代理模式(Proxy Pattern)属于结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

R语言数据分析案例46-不同区域教育情况回归分析和探索

一、研究背景 教育是社会发展的基石,对国家和地区的经济、文化以及社会进步起着至关重要的作用。在全球一体化进程加速的今天,不同区域的教育发展水平呈现出多样化的态势。这种差异不仅体现在教育资源的分配上,还表现在教育成果、教育投入与…

uni-app使用组件button遇到的问题

在HBuilder X工具中新建一个空白项目, 1、新建一个about页 然后在pages.json文件里加上路由 2、然后看下导航的方法,发现找不到navigateTo方法 参考:button | uni-app官网 第3行和第4行的代码倒是没问题的,第5行的代码有问题执行…

git自己模拟多人协作

目录 一、项目克隆 二、多人协作 1.创建林冲仓库 2.协作处理 3.冲突处理 三、分支推送协作 1.创建develop分支 2.发现git push无法把develop推送到远程 ​编辑 3.本地的分支推送到远程分支 四、分支拉取协作 五、远程分支的删除 远程仓库用的gitee 一、项目克隆 …

基于springboot+vue实现的卷烟营销统计分析系统 (源码+L文+ppt)4-129

摘 要 卷烟行业的快速发展使得卷烟营销统计分析系统成为了一个必不可少的工具。基于Java的卷烟营销统计分析系统旨在提供高效、准确和便捷的适用卷烟营销服务。本文讲述了基于java语言开发,后台数据库选择MySQL进行数据的存储。该软件的主要功能是进行卷烟营销统计…

解析CGI(通用网关接口)技术

在互联网技术飞速发展的今天,CGI(Common Gateway Interface,通用网关接口)作为一种常见的服务器端脚本技术,依然在许多老旧网站和小型网站中广泛使用。尽管如今有许多更现代的技术替代了CGI,但它仍然是理解…

OPPO C++面试题及参考答案

五层协议每层包含的协议 在计算机网络的五层协议体系结构(自下而上为物理层、数据链路层、网络层、传输层和应用层)中,各层包含多种协议。 物理层主要负责在物理介质上传输原始的比特流,包括像 RJ - 45 接口标准等物理接口规范&am…

OpenAI 普及 ChatGPT,开通热线电话,近屿智能深耕AI培训

12月19日,在OpenAI直播活动的第10天,宣布允许用户通过电话或WhatsApp与ChatGPT进行交互。并在美国推出 ChatGPT 热线电话,用户拨打后可与 ChatGPT 进行语音对话。 这项服务的一个亮点在于它兼容各种类型的通信设备——不论是现代智能手机如iP…

四种电子杂志制作软件

​大家好,今天给大家种草四种超级实用的电子杂志制作软件。无论你是专业出版人士,还是业余爱好者,这四款软件都能帮助你轻松制作出精美的电子杂志。让我们一起来看看吧! 1.FLBOOK FLBOOK是一款在线仿真翻页制作H5电子画册&#x…

idea配置

2024.3 idea 重装idea启动失败样式常用插件 重装idea启动失败 1、检查环境变量,是否已设置 2、检查安装目录下,或对应的环境变量对应的路径文件下 是否有javaagent,可先移除或者检查配置是否正确 样式 1、展示上方工具栏 2、展示内存使用…

微信小程序的轮播图学习报告

微信小程序轮播图学习报告 好久都没分享新内容了,实在惭愧惭愧。今天给大家做一个小程序轮播图的学习报告。 先给大家看一下我的项目状态: 很空昂!像一个正在修行的老道,空的什么也没有。 但是我写了 4 个 view 容器,…

L24.【LeetCode笔记】 杨辉三角

目录 1.题目 2.分析 模拟二维数组的大致思想 杨辉三角的特点 二维数组的元素设置代码 两个参数returnSize和returnColumnSizes 理解"有效"的含义 完整代码 提交结果 1.题目 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉…

项目亮点案例

其实对我来说是日常操作,但是如果在面试的时候面试者能把日常的事情总结好发出来,其实足矣。 想让别人认同项目,选取的示例需要包含以下要素: 亮点项目四要素:明确的目标,问题点,解决方法和结果…