前言程序员平时和mysql的打交道一定很多。可以说是天天接触,但是一个mysql表能存储多少数据呢?计算的依据是什么?接下来,我们就来逐一讨论知识,准备资料页。在操作系统中,我们知道为了与磁盘进行交互,内存也是分页的,一个页面的大小为4KB。同样,MySQL中为了提高吞吐量,也对数据进行了分页,但MySQL的数据页大小为16KB。(准确地说,InnoDB数据页大小为16KB)。详细学习请参考官网。我们可以使用下面的命令来查询。mysql>显示全局状态,如'innodb_page_size';+----------------+--------+|变量名|值|+----------------+------+|Innodb_page_size|16384|+----------------+-------+1rowinset(0.00sec)今天具体不用深究我们数据页的结构指针。我们知道默认是16kb。也就是说一个节点的数据大小是16kb索引结构(innodb)mysql索引结构大家应该都知道,就是下面的b+树结构。一般b+树的非叶子节点不存储数据,只有叶子节点(最底层)存储数据。然后我们来谈谈节点。节点是指(对于上图而言)每个红框选中的部分称为节点,而不是元素。了解了节点的概念,每个节点的大小为16kb之后,我们计算mysql能存储多少数据就容易多了。具体计算方法是计算根节点。首先,我们只看根节点。数据本身还有一小块空间,用来存放下一层索引数据页的地址。大小为6kb,所以我们可以用数据(8b+6b=14b)算出一个空间(以bigint为例)我们刚才说了一个数据页的大小为16kb,也就是(161024)b,那么根node可以存储(161024/(8+6))条数据,按照nodeout的计算方法计算出来的结果大概是1170条数据,剩下的就简单了。其他层节点的第二层其实更容易计算,因为每个节点的数据结构和节点的数据结构是一样的,节点的每个元素都会扩展一个节点,所以第二层的数据量为1170*1170=1368900,问题在第三层,因为innodb的叶子节点直接包含了整个mysql的数据,如果字段很多,数据占用的空间也不小。我们这里是按1kb计算的,所以在第三层,每个节点是16kb,那么每个节点可以存储16条数据,所以mysql总共可以存储的数据是1170117016=21902400(千万条记录)。事实上,计算结果与我们平时的工作经验是一致的。如果一张表的数据超过1000万条,就需要进行分表操作。总结最后用一张图总结一下今天讨论的内容,希望大家喜欢
