MySQL-关于如何保存“大数据”

MySQL-关于如何保存“大数据”_第1张图片

作者:赵师的工作日(赵明中)
现役Oracle ACE、MySQL 8.0 ocp、TiDB PCTA\PCTP、Elasticsearch Certified Engineer
微信号:mzzhao23
微信公众号:赵师的工作日
墨天轮社区:赵师的工作日
CSND:赵师的工作日

数据库的种类有很多,各类数据库充分发挥各自的优势从而保证业务稳定运行,mysql轻量级、关键数据,redis缓存、快,ES搜索,Mongodb大文档等等

但是,如果我们反其道而行之呢,用mysql来存储大文档。
这里只说最常用的innodb存储引擎,每个表的数据都是存储在聚簇索引树上。

首先聚簇索引?

因为在底层磁盘中,区=簇,一个区\簇,默认是连续的64个page,默认大小1M,区是聚簇索引分片叶子节点的最小单元,表数据是逻辑有序的存储在聚簇索引中的。

那么一个page就是16kb,在mysql中每页至少有两条数据(即单行数据不能超过8kb),其中每条记录都有三个隐藏列(自动聚簇索引id,操作号码,指针)

1、存储单元为页,16kb

2、每页至少有两条数据(单行数据不能超过8kb)

3、每条记录有3个隐藏列(自动聚簇索引id、操作号码、指针)

如果往mysql的一张表里插入了一条超过8k的数据会发生什么呢?,直接报错还是怎样。
(由于实验过程较简单,就直接以文字来描述了)

简单创建一张表,自增id(int)、a字段(longtext)、b字段(longtext)
此时插入一行数据直接上大文本,mysql并没有报错
接着查看表统计信息,该表1行数据4.2M,已远远超过行长度限制,但是数据还是被存下来了,而且可以被查询到。

说明数据还是被存下来了

那么数据到底是怎么存下来的。

以innodb存储引擎来说,对于二进制和字符串大对象处理都是一样的,统称“BLOB field”

如果当表的row_format为compact或redunant时,则数据会保存在external pages(溢出页,溢出页同索引页在同一个表空间)中,BLOB字段会在索引页保存768 bytes数据加上一个20bytes的指针,其他的数据保存在external pages

如果当表的row_format为dynamic或compressed,则索引页中不会再保存BLOB(BLOB前768bytes数据)只保存BLOB 指针,其他数据到保存在external pages中。

综上所述,无论哪种情况,当存储大数据字段时底层都需一个指针单独指向一个page页(溢出页)。

另外根据调研,即使大数据存在external pages中也是有上线的,最大是4G(2^32=4GB)

你可能感兴趣的:(mysql,大数据,数据库)