MySQL单表存多大的数据量比较合适

news/2024/10/6 15:00:30/文章来源:https://www.cnblogs.com/maqima/p/18449071

前言

经常使用MySQL数据库的小伙伴都知道,当单表数据量达到一定的规模以后,查询性能就会显著降低。因此,当单表数据量过大时,我们往往要考虑进行分库分表。那么如何计算单表存储多大的数据量合适?当单表数据达到多大的规模时,我们才要进行分库分表呢?

MySQL存储方式

首先我们要先了解一下MySQL存储数据的方式,以下都是针对InnoDB引擎来讲解的。

数据页

为了提高数据查询效率,MySQL采用了数据页的方式进行数据存储,一个数据页的大小是16KB,可以通过以下语句查询。

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 |
+------------------+-------+
1 row in set (0.00 sec)

根据结构示意图,我们可以看到,在这16KB的数据里,除了包括我们要记录的数据,还包含页头和页尾的开销(大约200字节)。因此,一个数据页中的有效数据空间大概为16184字节。

索引结构

InnoDB引擎的索引结构是B+树,只有叶子节点会存储记录的数据,非叶子节点只存索引。

数据量计算

通常来说,三层B+树的索引结构可以达到一个较好的检索性能,只需三次磁盘IO即可完成数据查询。因此,我们以此为例进行计算。

根节点计算

我们假设数据表的主键是一个bigint类型的字段,bigint类型的长度是8Byte。而根节点除了要储存主键字段数据,还有存储下一层索引数据页的地址,大小为6Byte。
可以算出一条数据的索引所占空间为8+6=14Byte,进而可以算出根节点可以存储16184/14=1156个指针。

第二层节点计算

第二层的每个节点的指针数量和根节点一样,都是1156个指针,节点数量和根节点的指针数量一致。因此可以得出,第二层的指针数量为1156*1156=1336336。

叶子节点计算

我们假设一行数据有100个字节,那么一个叶子节点可以存储16184/100≈161条数据。与第二层的指针数量相乘以后,可以得出总数据量为1336336*161=215150096条数据,大约2亿多条。

总结

通过以上的分析,我们可以发现,关于单表的数据量条数限制并没有一个统一的答案。单表可容纳多少数据量,这与表的主键以及数据行长度息息相关,需要具体情况具体分析。
另外,在阿里的开发规范中,关于数据库的建表规约,有一条这样的建议:

【推荐】单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
说明:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。

这个数据规模要比我们计算出来的小很多,可能由以下几个方面的原因导致:
1、实际业务中的表字段长度一般不止100个字节,主键索引结构也可能更加复杂,导致单个数据页可以存储的数据量大大降低;
2、磁盘IO性能的限制,当时机械硬盘还是主流,对数据量限制较为严格;
3、数据备份和恢复的难度,数据量过大会导致数据备份和恢复的难度大大提高。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【THM】kiba练习

脚本小子是这样的,黑客只要写POC就可以,可是脚本小子要考虑的事情就多了。 学到了新知识:利用网上的POC进行复现、利用Capabilities进行提权【THM】kiba练习 与本文相关的TryHackMe实验房间链接:TryHackMe | kiba 简介:识别数据可视化仪表板中允许执行远程代码执行的关键…

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构体、计数排序

PDF文档公众号回复关键字:202410061P7910 [CSP-J 2021] 插入排序 [题目描述] 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n^2) 的时间复杂度完成长度…

信息学奥赛复赛复习13-CSP-J2021-02插入排序-排序稳定性、插入排序、sort排序、结构图、计数排序

PDF文档公众号回复关键字:202410061P7910 [CSP-J 2021] 插入排序 [题目描述] 插入排序是一种非常常见且简单的排序算法。小 Z 是一名大一的新生,今天 H 老师刚刚在上课的时候讲了插入排序算法。 假设比较两个元素的时间为 O(1),则插入排序可以以 O(n^2) 的时间复杂度完成长度…

vue3 watch方法---监视基本类型数据

watch 监听定义的数据发生改变的时候执行什么函数 watch 方法有两个参数 watch(sum,箭头函数) 这个箭头函数里面有两个参数(newValue,oldValue)=> {},如下代码<template><!-- watch;监视数据变化 vue3 可以监视一下四种数据类型:ref定义的数据reactive 定义的…

2024-2025-1 20241421 《计算机基础与程序设计》第二周学习总结

这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK02这个作业的目标 数字化、信息安全、自学教材计算机科学概论(第七版)第1章并完成云班课测试、 《C语言程序设计》第1章并完成云班课测试作业正…

学期(2024-2025-1) 学号20241425 《计算机基础与程序设计》第2周学习总结

学期(2024-2025-1) 学号20241425 《计算机基础与程序设计》第2周学习总结 作业信息这个作业属于哪个课程 <班级的链接>(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>([2024-2025-1计算机基础与程序设计第二周作业]https://www.cnblo…

foobar2000 v2.1.6 汉化版

foobar2000 v2.1.6 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支持 unicode 及支持播放增益的高级标签功能. 特色: * 支持的…

面相快速入门教程3面部与年龄

3 面部与年龄0 开始探索自己容貌的最简单方法之一,就是学会观察自己人生旅程的路线图--基于此时此刻的自己,每一个十年,甚至每一段岁月都是怎样的。 每个主要特征大约代表你人生中的一个十年。一个大的、强烈的或特别美丽的特征被认为意味着这些年总体上将是积极的。此外,这…

【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。

可以定期对 VMware Cloud Foundation 环境中的相关核心组件(如 SDDC Manager、NSX Manager 以及 vCenter Server 等)创建配置备份,以防止当意外故障或数据丢失时,能够进行恢复。默认情况下,NSX Manager 组件的备份将创建并存储在 SDDC Manager 设备中内置的 SFTP 服务器上…

搭建Redis“主-从-从”模式集群并使用 RedisTemplate 实现读写分离

一、理论相关 我们知道,Redis具有高可靠性,其含义包括:数据尽量少丢失 - AOF 和 RDB 服务尽量少中断 - 增加副本冗余量,将一份数据同时保存在多个实例上,即主从库模式Redis主从库模式 - 保证数据副本的一致(读写分离):读操作:主库、从库都可以接收 写操作:首先到主库…

折腾笔记[2]-跨平台打包tauri程序

在macOS(arm64)平台打包tauri程序到Windows(amd64)平台. Packaging a Tauri application for the Windows (amd64) platform from macOS (arm64).摘要 在macOS(arm64)平台打包tauri程序到Windows(amd64)平台. Abstract Packaging a Tauri application for the Windows (amd64) …

博客格式-Markdown学习

标题 (#+空格+标题名字 一级标题) (##+空格+标题名字 二级标题) (###+空格+标题名字 三级标题) 字体 加粗 斜体 加粗斜体 划线 引用名人名言分割线图片超链接 百度 表格姓名 年龄 性别骆同学 15 男代码 int main(){cout<<"helloworld"return 0; }a,n=lis…