Mysql中的 TEXT 和 BLOB 解析

news2024/11/30 1:34:39

在这里插入图片描述

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀

🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。

💡 无论你是刚刚踏入编程世界的新人,还是希望进一步提升自己的资深开发者,在这里都能找到适合你的内容。我们共同探讨技术难题,一起进步,携手度过互联网行业的每一个挑战

📣 如果你觉得我的文章对你有帮助,请不要吝啬你的点赞👍分享💕和评论哦! 让我们一起打造一个充满正能量的技术社区吧!


目录标题

    • `TEXT` 和 `BLOB` 数据类型
      • 1. `TEXT` 和 `BLOB` 数据类型
      • 2. InnoDB 存储 `TEXT` 和 `BLOB` 数据的方式
      • 3. 如何存储 `TEXT` 和 `BLOB`
      • 4. 行格式与 `TEXT` 和 `BLOB`
      • 5.总结
    • TEXT 和 BLOB 如何使用索引呢?
      • 1. 索引的基本限制
      • 2. 如何创建前缀索引
      • 3. 索引的前缀长度限制
      • 4. 使用 `FULLTEXT` 索引
      • 5. `TEXT` 和 `BLOB` 的索引优化
      • 6. 总结


在这里插入图片描述

TEXTBLOB 数据类型

InnoDB 表中可以存储 TEXTBLOB 类型的数据,它们都是用来存储大文本和二进制数据的类型。这些数据类型并不影响 InnoDB 使用的 行格式 存储方式。让我们详细看看 TEXTBLOB 数据类型在 InnoDB 表中的存储机制。

1. TEXTBLOB 数据类型

在 MySQL 中,TEXTBLOB 都是用于存储大量数据的字段类型:

  • TEXT:用于存储较长的字符串数据,可以存储最大 65,535 字符的文本数据。
  • BLOB:用于存储二进制数据,大小也是最大 65,535 字节,适用于存储非文本数据(如图片、音频、视频等)。

这些字段类型在 InnoDB 表中的存储方式稍微有些不同,特别是对于大数据量的存储。

2. InnoDB 存储 TEXTBLOB 数据的方式

  • 行格式(Row Storage):InnoDB 使用行格式来存储数据。对于表中的每一行,数据会以行的形式存储,所有的列值都会保存在一起。

  • 数据页:InnoDB 将表数据分成多个 数据页(一般为 16KB)。对于一个表中的普通列,数据会存储在同一行的同一个数据页中。而对于 TEXTBLOB 类型的列,如果数据比较小,它们通常也会直接存储在数据页中。如果数据比较大,InnoDB 会将这些大字段的数据存储在 溢出页(overflow pages)中,这些溢出页会与原始行数据分开存储。

3. 如何存储 TEXTBLOB

  • 小数据(小于 768 字节):如果 TEXTBLOB 的数据小于 768 字节,InnoDB 会把这些数据直接存储在行记录中(即存储在数据页内)。

  • 大数据(大于 768 字节):对于较大的 TEXTBLOB 数据,InnoDB 会将这些数据存储在单独的溢出页中,而原始行记录会保存一个指向这些溢出页的指针。这个机制叫做 外部存储(off-page storage),这种方式有效减少了行记录占用的空间。

4. 行格式与 TEXTBLOB

  • 在 InnoDB 中,即使你有 TEXTBLOB 字段,表仍然是以行格式存储的,只是当这些字段的数据较大时,它们的数据会被拆分开来,存储在不同的位置(溢出页)。因此,InnoDB 使用行格式存储所有类型的数据,TEXTBLOB 字段并不会改变这一点。

  • InnoDB 的 Compact Row FormatRedundant Row Format 都会按这种方式存储 TEXTBLOB 数据,只不过不同的行格式可能会影响如何分配数据页和存储数据的细节。

5.总结

  • InnoDB 表是行格式存储的,这适用于包括 TEXTBLOB 类型在内的所有数据列。
  • TEXTBLOB 列的数据存储方式与普通数据列不同——它们可能会存储在数据页内(如果数据较小),或者会被分配到**溢出页**中(如果数据较大)。
  • 行格式存储并不会影响 TEXTBLOB 的使用,它们依然是作为 InnoDB 行的一部分进行管理,只是它们的存储位置可能会有所不同。

因此,虽然你可以在 InnoDB 表中使用 TEXTBLOB 数据类型,但这并不改变表使用行格式存储的方式。

TEXT 和 BLOB 如何使用索引呢?

在 MySQL 中,TEXTBLOB 类型的数据可以用索引,但是由于这些数据类型的特殊性质,索引的使用有一些限制和注意事项。以下是关于如何在 TEXTBLOB 字段上使用索引的详细解释。

1. 索引的基本限制

  • 不能直接索引整个字段:由于 TEXTBLOB 类型字段可以包含大量数据,它们通常不适合作为索引的整个内容。因此,MySQL 不允许直接对整个 TEXTBLOB 列建立索引。
  • 索引前缀:你可以创建一个 前缀索引(Prefix Index),即只索引字段的前部分数据。这对于较长的 TEXTBLOB 字段特别有用,因为只需要索引前几个字符(或字节)即可提高查询效率,而不必索引整个内容。

2. 如何创建前缀索引

对于 TEXTBLOB 字段,你可以通过指定 前缀长度 来创建一个前缀索引。例如,如果你有一个 TEXT 字段,并且只希望索引其前 100 个字符,可以这样做:

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    description TEXT,
    INDEX (description(100))  -- 只索引前100个字符
);

这样,MySQL 会为 description 字段的前 100 个字符建立一个索引。如果你的字段是 BLOB 类型,前缀索引也是类似的:

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    data BLOB,
    INDEX (data(100))  -- 只索引前100个字节
);

3. 索引的前缀长度限制

  • 在 MySQL 中,前缀长度的最大值与存储引擎、字符集以及数据的存储方式密切相关。

    • InnoDB 引擎:如果是 TEXT 字段,并且使用 UTF-8 编码(每个字符最大 3 字节),你可能最多只能索引 767 字节。因此,如果你索引一个 UTF-8 编码的 TEXT 字段,你最多可以索引 767/3 ≈ 255 个字符。
    • MyISAM 引擎:对于 MyISAM 引擎的表,最大索引前缀长度通常是 1000 字节,因此对于 BLOB 类型字段,最多可以索引 1000 个字节。

    注意:对于 TEXTBLOB 字段,索引的前缀长度会受到最大索引长度(通常为 767 字节或 1000 字节)的限制,具体取决于你使用的字符集和存储引擎。

4. 使用 FULLTEXT 索引

对于大文本数据(如 TEXT 类型),如果你需要执行全文搜索,可以使用 FULLTEXT 索引FULLTEXT 索引专门用于文本数据的查找,允许你对 TEXTBLOB 字段进行更复杂的搜索操作。

FULLTEXT 索引的创建方式如下:

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    content TEXT,
    FULLTEXT (content)
);

然后,你可以使用 MATCHAGAINST 语句来执行全文搜索:

SELECT * FROM example
WHERE MATCH (content) AGAINST ('search term' IN NATURAL LANGUAGE MODE);

FULLTEXT 索引适用于较长的文本字段,支持更多的全文搜索功能,如 ANDORNOT 等搜索操作,但仅适用于 MyISAMInnoDB 存储引擎(MySQL 5.6 及以上版本开始支持 InnoDB 引擎的 FULLTEXT 索引)。

5. TEXTBLOB 的索引优化

  • 前缀索引:由于 TEXTBLOB 字段可能存储非常大的数据量,通常索引它们的前缀部分会带来性能优化,而不是尝试索引整个字段。你可以根据实际需要选择索引字段的前 N 个字符或字节。
  • FULLTEXT 索引:如果你的查询模式需要对文本字段进行复杂的搜索操作,FULLTEXT 索引是一个有效的选择,尤其是对于 TEXT 类型字段。

6. 总结

  • 前缀索引:对于 TEXTBLOB 类型,索引整个字段通常不现实,你可以通过 前缀索引 来索引字段的前一部分内容。这样可以有效地加速查询,尤其是在你只需要查找字段的前几个字符或字节时。
  • FULLTEXT 索引:对于长文本字段(如 TEXT),如果你需要执行全文搜索,可以使用 FULLTEXT 索引,它为大规模文本搜索提供了更强大的支持。
  • 索引大小限制:在创建前缀索引时要注意索引的大小限制,尤其是字符集和存储引擎的不同限制。

通过合理使用这些索引类型,你可以提高在 TEXTBLOB 字段上的查询性能,同时避免存储和性能上的问题。

乐于分享和输出干货的WXGZG:JavaPersons

在这里插入图片描述

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

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

相关文章

Oracle LinuxR7安装Oracle 12.2 RAC集群实施(DNS解析)

oracleLinuxR7-U6系统Oracle 12.2 RAC集群实施(DNS服务器) 环境 RAC1RAC2DNS服务器操作系统Oracle LinuxR7Oracle LinuxR7windows server 2008R2IP地址172.30.21.101172.30.21.102172.30.21.112主机名称hefei1hefei2hefei数据库名hefeidbhefeidb实例名…

Redis(5):哨兵

一、作用和架构 1. 作用 在介绍哨兵之前,首先从宏观角度回顾一下Redis实现高可用相关的技术。它们包括:持久化、复制、哨兵和集群,其主要作用和解决的问题是: 1)持久化:持久化是最简单的高可用方法(有时甚…

Goland或Idea启动报错

Goland或Idea启动不了 报错如图: 原因:破解导致 解决方案 环境变量中有关Goland的全部删除

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统:银河麒麟V10,CPU: x86_64 架构 下载地址,麒麟官网:https://www.kylinos.cn/ 数据库:dm8_20220915_x86_kylin10_64 下载地址,达梦数据库官网:https://…

(0基础保姆教程)-JavaEE开课啦!--11课程(初识Spring MVC + Vue2.0 + Mybatis)-实验9

一、什么是Spring MVC? Spring MVC 是一个基于 Java 的 Web 框架,遵循 MVC 设计模式,用于构建企业级应用程序。它通过控制器(Controller)处理用户请求,模型(Model)处理业务逻辑,视图(View)展示数据,实现了请…

NLP信息抽取大总结:三大任务(带Prompt模板)

信息抽取大总结 1.NLP的信息抽取的本质?2.信息抽取三大任务?3.开放域VS限定域4.信息抽取三大范式?范式一:基于自定义规则抽取(2018年前)范式二:基于Bert下游任务建模抽取(2018年后&a…

【JavaEE初阶 — 网络编程】TCP流套接字编程

TCP流套接字编程 1. TCP & UDP 的区别 TCP 的核心特点是面向字节流,读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

记录一次 k8s 节点内存不足的排查过程

背景:前端服务一直报404,查看k8s日志,没发现报错,但是发现pods多次重启。 排查过程: 查看pods日志,发现日志进不去。 kubectrl logs -f -n weave pod-name --tail 100查看pod describe kubectl describ…

Java文件遍历那些事

文章目录 一、简要概述二、文件遍历几种实现1. java实现2. Apache common-io3. Spring 三、最终结论 一、简要概述 文件遍历基本上是每个编程语言具备的基本功能,Java语言也不例外。下面我们以java原生实现,Apache common-io、spring框架实现为例来比较…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

【JS】React与Vue的异步编程对比:深度解析与实战案例全面指南

文章目录 前言更多实用工具React与Vue概述ReactVue 异步编程基础回调函数PromiseAsync/Await React中的异步编程使用Axios进行数据请求异步操作与组件生命周期React Hooks中的异步处理 Vue中的异步编程使用Axios进行数据请求异步操作与Vue生命周期Vue Composition API中的异步处…

【iOS】知乎日报总结

文章目录 前言首页网络请求轮播图上滑加载图片请求 文章详情页WKWebView的使用点赞、收藏持久化——FMDB的使用 其他问题沙盒问题单元格点击其他 总结 前言 在系统学习了OC语言和UI控件后,知乎日报是第一个比较大的项目,耗时一个多月时间,里面…

算法竞赛(Python)-链表

文章目录 一 链表简介1.1链表定义1.2 双向链表1.3 循环链表 二、链表的基本操作2.1 链表的结构定义2.2 建立一个线性链表2.3 求线性链表的长度2.4 查找元素2.5 插入元素2.5.1 链表头部插入元素2.5.2 链表尾部插入元素2.5.3 链表中间插入元素 2.6 改变元素2.7 删除元素2.7.1 链表…

Unity ShaderLab 实现网格爆炸

实现思路: 沿着3D物体每个面的法线,将面偏移一定的位置。 Shader Graph实现如下: Shader Lab 实现如下: Shader "Unlit/MeshExplode" {Properties{_MainTex ("Texture", 2D) "white" {}_Distan…

快速上手:如何开发一个实用的 Edge 插件

在日常浏览网页时,背景图片能够显著提升网页的视觉体验。如果你也想为自己的浏览器页面添加个性化背景图片,并希望背景图片设置能够持久保存,本文将介绍如何通过开发一个自定义Edge插件来实现这一功能。我们将涵盖保存背景设置到插件选项页&a…

【Maven】功能和核心概念

1. 什么是Maven 1.1 Maven的概念 Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。 1.2 为什么要使用Maven? 在项目开发中,我们需要引用各种 jar 包,引用的 jar 包可能有…

神经网络归一化方法总结

在深度学习中,归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结,包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

视频汇聚平台Liveweb国标GB28181视频平台监控中心设计

在现代安防视频监控领域,Liveweb视频汇聚平台以其卓越的兼容性和灵活的拓展能力,为用户提供了一套全面的解决方案。该平台不仅能够实现视频的远程监控、录像、存储与回放等基础功能,还涵盖了视频转码、视频快照、告警、云台控制、语音对讲以及…

hubu新星杯实践能力赛模拟赛web/Misc-wp

ez_eval <?php highlight_file(__FILE__); error_reporting(0);$hubu $_GET[hubu];eval($hubu);?> 先进行代码审计&#xff0c;GET传参hubu&#xff0c;并执行命令&#xff0c;没有任何绕过&#xff0c;放开手脚去做 payload: ?hubusystem(cat /f*); #直接rcerc…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…