当前位置: 首页 > news >正文

滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用

全文目录:

    • 前言
    • 8.3 JSON与全文检索
      • 1. JSON数据类型的使用
        • 1.1 JSON 数据类型概述
        • 1.2 JSON 数据的插入与查询
        • 1.3 JSON 常用函数与操作
        • 1.4 JSON使用的优缺点与性能考虑
      • 2. 全文索引与全文检索
        • 2.1 全文索引概述
        • 2.2 全文检索的使用
        • 2.3 全文检索模式
        • 2.4 全文索引优化与性能调优
      • 3. 拓展与实际应用
        • 3.1 JSON与全文检索的结合
        • 3.2 全文检索在生产环境中的应用
      • 4. 实战项目:在线博客系统中的全文检索
    • 小结
    • 下期预告:实战项目——在线博客系统

前言

在上一期中,我们探讨了事件调度,并讨论了如何通过自动调度器在数据库中高效执行定时任务。通过事件调度,管理员可以优化数据库的运行流程并减少人为干预的操作。然而,随着数据的多样化和复杂度的增加,传统的关系型数据库结构面临着更大的挑战。为了处理复杂的半结构化数据,数据库需要引入更灵活的解决方案,例如使用JSON数据类型。同时,在大量文本数据的应用场景中,快速检索大规模文本信息成为关键问题,全文索引提供了一种高效的解决方案。

本期内容将深入探讨数据库中的JSON数据类型及其使用,帮助您了解如何灵活存储和查询复杂的JSON数据。同时,我们将探讨全文检索的原理和应用,展示如何通过全文索引高效地进行大规模文本搜索,并结合实际案例展示其在生产环境中的应用。

最后,我们还将简要预告下期内容实战项目:在线博客系统,展示如何在实战项目中运用这些技术。

8.3 JSON与全文检索

1. JSON数据类型的使用

JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁易读、灵活结构而被广泛用于现代Web应用和数据传输中。随着需求的变化,许多数据库(如MySQL、PostgreSQL等)都引入了对JSON数据类型的原生支持,使得存储和处理半结构化数据变得更加简单。

1.1 JSON 数据类型概述

在关系型数据库中,传统的数据结构通常要求字段类型固定,而JSON格式则允许以嵌套、灵活的方式存储对象和数组。这样,开发者可以根据实际需求动态调整数据结构,而不需要频繁更改表结构。例如,用户的偏好、产品的动态属性、复杂的配置信息等都可以通过JSON格式灵活存储。

在MySQL中,我们可以使用JSON类型定义字段,并通过标准的SQL查询对其进行操作。例如,以下示例展示了一个包含用户偏好数据的表:

CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),preferences JSON
);

preferences字段中,我们可以存储类似以下的JSON数据:

{"theme": "dark","notifications": {"email": true,"sms": false},"language": "en"
}

这种灵活性使得开发者能够轻松处理复杂的嵌套数据结构。

1.2 JSON 数据的插入与查询

将JSON数据插入到数据库中非常简单,我们可以直接在SQL查询中嵌入JSON对象。例如:

INSERT INTO users (name, preferences)
VALUES ('Alice', '{"theme": "dark", "notifications": {"email": true, "sms": false}, "language": "en"}');

要查询JSON字段中的特定值,MySQL提供了强大的函数支持。例如,JSON_EXTRACT()函数允许提取JSON字段中的某个属性:

SELECT name, JSON_EXTRACT(preferences, '$.theme') AS theme
FROM users
WHERE JSON_EXTRACT(preferences, '$.language') = 'en';

此查询将提取用户偏好的语言为en的所有用户,并显示他们的主题设置。

1.3 JSON 常用函数与操作

为了支持JSON数据的操作,MySQL等数据库引入了多个函数用于处理JSON字段。以下是常用的一些操作:

  • JSON_SET():用于更新JSON字段的值。例如,修改某用户的通知设置:

    UPDATE users
    SET preferences = JSON_SET(preferences, '$.notifications.sms', true)
    WHERE name = 'Alice';
    
  • JSON_ARRAY_APPEND():用于向JSON数组添加元素。例如,向用户的兴趣列表中追加一个新的兴趣:

    UPDATE users
    SET preferences = JSON_ARRAY_APPEND(preferences, '$.interests', 'reading')
    WHERE name = 'Alice';
    
  • JSON_REMOVE():用于删除JSON字段中的某个属性。例如,删除用户的语言设置:

    UPDATE users
    SET preferences = JSON_REMOVE(preferences, '$.language')
    WHERE name = 'Alice';
    

这些操作使得开发者可以在不改变数据库表结构的情况下,灵活管理嵌套的复杂数据。

1.4 JSON使用的优缺点与性能考虑

尽管JSON数据类型带来了极大的灵活性,但在使用时也需要谨慎对待。以下是一些最佳实践和注意事项:

  • 结构化与规范化:虽然JSON格式允许灵活存储,但在实际使用中,保持数据结构的一致性有助于提高查询和维护的效率。
  • 查询性能:在处理大规模JSON数据时,直接从JSON字段中提取数据可能导致查询性能下降。为提高性能,可以使用虚拟列(generated columns)或为JSON字段的常用属性建立索引。

2. 全文索引与全文检索

在处理大规模文本数据时,传统的查询方式往往难以满足复杂的文本搜索需求。为了支持高效的文本检索,许多数据库引入了全文索引,并提供了基于关键字的全文检索功能。

2.1 全文索引概述

全文索引是为文本字段设计的一种特殊索引,能够将文本分解为单词并创建倒排索引,从而支持快速的关键字搜索。与传统索引不同,全文索引关注的是文本中的单词出现频率和位置,而不是字段的精确匹配。

在MySQL中,可以为VARCHARTEXT类型的字段创建全文索引。例如,假设我们有一个存储博客文章的表:

CREATE TABLE posts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT,FULLTEXT(title, content)
);

此时,MySQL会为titlecontent字段创建全文索引,以支持高效的全文搜索。

2.2 全文检索的使用

创建了全文索引后,MySQL允许我们使用MATCHAGAINST关键字进行全文检索。MATCH指定要搜索的字段,AGAINST指定搜索的关键词:

SELECT * FROM posts
WHERE MATCH(title, content) AGAINST('database optimization' IN NATURAL LANGUAGE MODE);

此查询会返回所有包含关键词database optimization的博客文章。在自然语言模式下,MySQL会根据关键词的出现频率、重要性等因素对结果进行评分,返回最相关的结果。

2.3 全文检索模式

MySQL支持不同的全文检索模式,每种模式适用于不同的搜索场景。常见的模式包括:

  • 自然语言模式(Natural Language Mode):适用于大多数普通文本搜索,系统根据文本分词和词频对搜索结果进行排序。

  • 布尔模式(Boolean Mode):允许用户定义更复杂的搜索逻辑,可以使用操作符来控制查询行为。例如,使用+表示必须包含,-表示不能包含:

    SELECT * FROM posts
    WHERE MATCH(title, content) AGAINST('+database -mysql' IN BOOLEAN MODE);
    

    这条查询会返回包含database但不包含mysql的文章。

  • 查询扩展模式(Query Expansion Mode):在自然语言模式的基础上,通过扩展搜索范围,返回更多相关的搜索结果。这种模式适用于模糊搜索场景。

2.4 全文索引优化与性能调优

在处理大量文本数据时,全文索引的性能优化至关重要。以下是一些优化建议:

  • 限制索引字段:仅为需要检索的字段创建全文索引,避免不必要的性能消耗。
  • 调整分词规则:不同的语言和应用场景对分词的要求不同,MySQL允许开发者根据需求配置自定义的分词器,提升全文检索的精度。
  • 缩小搜索范围:尽量减少全文检索的文本量。例如,可以通过WHERE子句先过滤出符合条件的记录,再进行全文检索,从而提高查询效率。

3. 拓展与实际应用

3.1 JSON与全文检索的结合

在某些复杂的应用场景中,我们可能同时需要使用JSON数据存储复杂结构化信息,并结合全文检索实现高效的文本搜索。例如,在电商系统中,我们可以通过JSON存储产品的动态属性,并通过全文索引实现对产品描述的搜索。

这种结合应用可以大大提升系统的灵活性,同时支持复杂的搜索需求。以一个简单的电商产品搜索为例,我们可以将产品信息和评论存储在JSON

字段中:

CREATE TABLE products (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255),details JSON,description TEXT,FULLTEXT(description)
);

接着,我们可以根据用户输入的关键词,在产品描述中进行全文检索,并结合产品的JSON属性筛选结果。

3.2 全文检索在生产环境中的应用

全文检索在内容管理系统(CMS)、电子商务平台、知识库和社交网络等应用中得到了广泛应用。在这些场景中,用户通常需要通过关键词快速找到相关的文章、产品或其他信息。通过合理配置全文索引和优化查询,我们可以确保全文检索的高效性,并显著提升用户体验。

例如,社交网络平台可能需要支持对用户发布内容的快速检索。在这种场景下,全文索引能够有效提高关键词匹配速度,确保用户能够快速找到与其搜索相关的内容。

4. 实战项目:在线博客系统中的全文检索

假设我们正在开发一个在线博客系统,用户可以通过关键词在博客文章中进行搜索。为此,我们可以为博客文章创建全文索引,并实现简单的搜索功能:

CREATE TABLE articles (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),body TEXT,FULLTEXT(title, body)
);

用户在搜索框中输入关键词时,系统将执行如下查询,返回相关的文章:

SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('database optimization' IN NATURAL LANGUAGE MODE);

通过这种方式,系统可以根据用户输入的关键词快速检索博客文章,并根据相关性进行排序,提升搜索体验。

小结

本期内容我们详细探讨了JSON数据类型全文检索的使用方法。通过使用JSON数据类型,开发者可以灵活地存储半结构化数据,而全文索引则提供了高效的文本搜索解决方案。结合实际应用场景,这两种技术可以帮助开发者构建功能强大、性能优越的数据库系统。

下期预告:实战项目——在线博客系统

在接下来的实战项目中,我们将结合前几期学习的数据库技术,构建一个完整的在线博客系统。该系统将涵盖用户管理、文章发布、评论系统和全文检索功能,帮助大家深入理解如何在实际项目中应用数据库的各类技术。敬请期待!

相关文章:

滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用

全文目录: 前言8.3 JSON与全文检索1. JSON数据类型的使用1.1 JSON 数据类型概述1.2 JSON 数据的插入与查询1.3 JSON 常用函数与操作1.4 JSON使用的优缺点与性能考虑 2. 全文索引与全文检索2.1 全文索引概述2.2 全文检索的使用2.3 全文检索模式2.4 全文索引优化与性能…...

position定位静态定位/绝对定位/相对定位

1.静态定位static&#xff1a;按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...

2024年09月CCF-GESP编程能力等级认证C++编程三级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 下列代码中,输出结果是( ) #include<iostream> using namespace std; i...

Web自动化Demo-PHP+Selenium

1.新建工程 打开PhpStorm新建工程如下&#xff1a; 打开终端输入如下命令安装selenium&#xff1a; composer require php-webdriver/webdriver 2.编写代码 <?php require vendor/autoload.php;use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver…...

Python速成笔记——知识(GUI自动化处理屏幕和按键输出)

处理屏幕 获取屏幕快照 函数:pyautogui.screenshot(); 【注】该函数返回包含一个屏幕快照的Image对象; 分析屏幕快照 函数:pyautogui.pixel(); 【注】 传递一个坐标的元组,函数返回坐标对应像素点的RGB值(RGB元组) 函数:pyautogui.pixelMatchesColor() 【注】 函数第一…...

计算机是如何输入存储输出汉字、图片、音频、视频的

计算机是如何输入存储输出汉字、图片、音频、视频的 为了便于理解&#xff0c;先了解一下计算机的组成。 冯诺依曼计算机的五大组成部分。分别是运算器、控制器、存储器、输入设备和输出设备。参见下图&#xff1a; 一、运算器 运算器又称“算术逻辑单元”&#xff0c;是计算…...

springboot系列--web相关知识探索五

一、前言 web相关知识探索四中研究了请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索四中主要研究了复杂参数底层绑定原理。本次主要是研…...

开源商城系统crmeb phpstudy安装配置

BOSS让我最快时间部署一套开源商场系统&#xff0c;今天就以crmeb为例。 快速部署在linux中我会首选docker&#xff0c;因为我要在windows中部署&#xff0c;本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点&#xff1a; CRMEB产品与服务 CRMEB通过将CRM&#x…...

【论文阅读笔记】Bigtable: A Distributed Storage System for Structured Data

文章目录 1 简介2 数据模型2.1 行2.2 列族2.3 时间戳 3 API4 基础构建4.1 GFS4.2 SSTable4.3 Chubby 5 实现5.1 Tablet 位置5.2 Tablet 分配5.3 为 tablet 提供服务5.4 压缩5.4.1 小压缩5.4.2 主压缩 6 优化6.1 局部性组6.2 压缩6.3 缓存6.4 布隆过滤器6.5 Commit日志实现6.6 T…...

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务

linux从入门到精通-从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;十一&#xff09;–rpm管理和计划任务 一、rpm管理&#xff08;重点&#xff09; 1、rpm管理 作用&#xff1a; rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…...

【C++几种单例模式解读及实现方式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、单例是什么&#xff1f;二、解读1.懒汉式2.饿汉式3.static变量特性4.call_once特性 总结 前言 单例模式几乎是每种语言都不可少的一种设计模式&#xff0c…...

QT开发--串口通信

第十六章 串口通信 16.1 串口通信基础 串口通信主要通过DB9接口&#xff0c;适用于短距离&#xff08;<10米&#xff09;。关键参数包括&#xff1a; 波特率&#xff1a;每秒传输bit数&#xff0c;如9600。数据位&#xff1a;信息包中的有效数据位数。停止位&#xff1a;…...

数据库(至少还的再花两天 )

1 连接查询 左连接 右连接 2 聚合函数 SQL 统计求和 求最值 count sum avg max min 3 SQL关键字 limit 分页 group by 分组 distinct 去重 4 Select执行顺序 from where group by order by 5 数据库三范式 原子性 唯一性 直接性 6 存储引擎 MyISAM InnoDB 7 …...

网络安全公司及其主要产品介绍

以下是一些全球领先的网络安全公司及其主要产品介绍&#xff1a; 一、思科&#xff08;Cisco&#xff09; 思科是全球最大的网络设备供应商之一&#xff0c;其网络安全产品以企业级解决方案为主&#xff0c;覆盖多种安全需求。 Cisco ASA&#xff08;Adaptive Security Appli…...

orjson:高性能的Python JSON库

在Python中处理JSON数据是一项常见任务,标准库的json模块虽然功能齐全,但在性能方面还有提升空间。今天我要向大家介绍一个出色的第三方JSON库 - orjson。 orjson简介 orjson是一个快速、正确的Python JSON库。它具有以下主要特点: 性能卓越 - 在序列化和反序列化方面都比标准…...

常见几大排序算法

排序算法是计算机科学中的基本算法&#xff0c;它们将一个无序的数组或列表按特定顺序进行排列&#xff08;如升序或降序&#xff09;。常见的排序算法可以根据其时间复杂度、空间复杂度和适用场景分类。以下是几种常见的排序算法&#xff1a; 1. 冒泡排序&#xff08;Bubble …...

Linux下CMake入门

CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具&#xff0c;主要用于管理构建过程。CMake 不直接构建项目&#xff0c;而是生成特定平台上的构建系统&#xff08;如 Unix 下的 Makefile&#xff0c;Windows 下的 Visual Studio 工程&#xff09;&#xff0c;然后…...

网络资源模板--Android Studio 实现简易记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…...

根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化

文章目录 函数组件的特点props组件间的传值父传子看上例子传父兄弟组件传值祖先组件传值 插槽基础插槽具名插槽作用域插槽 样式操作**CSS Modules** 生命周期useRef常用hookuseStateuseEffectuseContextuseReduceruseMemouseCallback 高阶组件什么时候使用 react性能问题和优化…...

HTML(六)超链接

HTML讲解&#xff08;一&#xff09;body部分_html body-CSDN博客 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>title</title> </head><body><a href"https://blog.csdn.net/2301_8034953…...

【Coroutines】Implement Lua Coroutine by Kotlin - 2

Last Chapter Link 文章目录 Symmetric CoroutinesNon-Symmetric Coroutine SampleSymmetric Coroutine SampleHow to Implement Symmetric CoroutinesWonderful TricksCode DesignTail Recursion OptimizationFull Sources Symmetric Coroutines in last blog, we have talk…...

java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频)

这是什么系统&#xff1f; 资源获取方式再最下方&#xff08;本次10月份活动福利&#xff0c;免费提供下载&#xff0c;自行到对应的方式1下载&#xff0c;csdn的0积分下载&#xff09; java计算机毕设课设—扫雷游戏(附源码、文章、相关截图、部署视频) 基于Java的扫雷游戏…...

AndroidLogger 使用问题

Q1&#xff1a;解压zip后&#xff0c;启动Notepad未看到AndroidLogger工具栏 请检查plugins下安装位置是否正确&#xff0c;必须与下图一致&#xff0c;再确认Notepad 是否为 x64 &#xff1f; Q2&#xff1a;使用 adb 可以显示已连接&#xff0c;但是获取不到日志 暂时不确定问…...

数据库常见面试

8道面试题 目录 目录 7道面试题 1.怎样进行sql优化 4、group by优化 5、limit优化 6、count优化 7、update优化 2.。怎样查看sql执行情况呢(哪个关键字)&#xff0c;说说你对这个关键字的认识 4) possible_key&#xff1a; 5) key 3.说说你对innodb和 myisam的理解 …...

boxplot 绘制箱线图,添加数据点

先看效果图 import matplotlib.pyplot as plt #! 解决不显示的问题&#xff1a;中文设置为宋体格式 plt.rcParams[font.family] ["Times New Roman", SimSun]def plot_boxplot(data_list, out_file, x_custom_labels):# 画图fig, ax plt.subplots(figsize(90, 6…...

用sdkman管理多个jdk切换

前言 最近项目前后端进行升级&#xff0c;需要在jdk8和jdk17两个版本切换。最简单的是通过手动切换&#xff0c;但切换过程太繁琐&#xff0c;修改环境变量&#xff0c;达到切换目的。于是尝试其它解决方案&#xff0c;最终确实使用sdkman工具。 sdkman 是一款面向Java开发者的…...

【AIGC】ChatGPT提示词Prompt高效编写模式:结构化Prompt、提示词生成器与单样本/少样本提示

&#x1f4af;前言 在如今AI技术迅猛发展的背景下&#xff0c;尽管像ChatGPT这样的大型语言模型具备强大的生成能力&#xff0c;但它们的输出质量有时仍难以完全满足我们的预期。为了让ChatGPT生成更加准确、可靠的内容&#xff0c;掌握高效的Prompt编写技巧变得尤为重要。本文…...

反调式实战(有道翻译窗口弹出)

1.添加脚本断点实现源码获取 2.Function构造器构造debugger 因为是窗口被弹出的情况&#xff0c;所以window.closefunction()构造debugger。 3.定位到影响弹出的JavaScript代码片段 反调试思想&#xff1a;置空和替换&#xff0c;所以将其JavaScript进行注释或者删除。 这里主…...

verilog端口使用注意事项

下图存在组合逻辑反馈环&#xff0c;即组合逻辑的输出反馈到输入(赋值的左右2边存在相同的信号)&#xff0c;此种情况会造成系统不稳定。比如在data_in20的情况下&#xff0c;在data_out0 时候&#xff0c;输出的数据会反馈到输入&#xff0c;输入再输出&#xff0c;从而造成不…...

Docker常用命令大全汇总

Docker是一种流行的容器化平台,可以在一个独立的、隔离的环境中构建、部署和运行应用程序。了解Docker常用命令可以帮助我们更高效地管理容器,快速开发和部署应用。本文将整理一系列Docker的常用命令,便于日常使用和学习。 1 Docker基础命令 1.1 启动/停止/重启docker # …...