mysql一个数据库对表数量有没有限制?

见面!肯定会有影响!表越多,过程就越慢,即使表不包含任何数据!一般MYSQL控制在128张表左右,数据量在20G左右。
运行效果基本不变。
如果超过了,速度肯定会受到影响。
这还取决于您的计算机配置。
如果配置一般,128、20G就很困难了!

为什么大家说mysql数据库单表最大两千万?依据是啥?

故事要从很多年前开始。
您一定听说过,一个数据库表最多只能使用2kw的数据。
如果超过,性能将显着下降。
当我第一次设计它的时候,我从来没有想到这款手表可以加速得这么快。


数据库表中理论上的最大行数是多少?创建表的SQL是这样写的,其中id为主键。
主键本身是唯一的,这意味着主键的大小可以限制表的上限。
如果主键声明为int大小,即32位,那么它可以支持2^32-1,即大约21亿。
如果是h3int的话就是2^64-1,但是这个数字太大了。
一般来说,在达到这个极限之前,磁盘是无法承受的。
除了主键之外,还有哪些因素影响行数?索引的内部结构采用的是B+树,这也是八篇文中的老篇章了,想必大家都比较熟悉。
为了让人们不要太厌倦评判丑陋,今天我尝试从另一个角度告诉大家这个问题。
假设我们有这样一张用户数据表。
在users表中,id是唯一主键。
这些看起来像数据行。
为了方便起见,我们稍后将它们称为记录。
该表看起来像Excel电子表格。
excel数据是硬盘上的xx.excel文件。
上面的用户表数据在硬盘上其实也类似,位于user.ibd文件中。
它的意思是用户表innodbdata文件。
从技术上讲,它也称为表空间。
尽管在数据表中它们看起来彼此相邻。
但实际上它们在user.ibd中被分成许多小数据页,每个页大小为16k。
整个页面容量为16k,不算大,但这么多记录肯定一页放不下,所以会分成几个页面。
而且不可能全部使用这16k来存储记录,对吗?由于记录被分为多个部分并放置在多个页上,因此为了唯一标识哪个页是哪个页,必须包含页号(本质上是表空间的地址偏移量)。
此外,为了链接这些数据页,引入了before和after指针来指向上一页和下一页。
它们被添加到页面标题中。
16k需要读写的页面并不小。
可能是录音时拔掉了电源线。
因此,为了保证数据页的准确性,还包含了测试代码。
该内容已添加到页面底部。
剩余的空间用于存储我们的记录。
如果一条记录的行数特别多,进入页面时浏览每一行的效率很低,因此会为这些数据创建页目录,具体实现细节并不重要。
你需要知道的是,它可以通过二分查找将搜索效率从O(n)变为O(lgn)。
从页面到索引的页面结构如果我们要搜索一条记录,我们可以找到表空间中的每个页面,然后拉出其中的记录以确定它们是否是我们要查找的内容。
当数量较少时,这样做没有问题。
行数越多,性能越慢,因此,为了加快搜索速度,我们可以选择每个数据页中主键ID最小的记录,只需要它们的主键ID和该页的页码即可。
页。
创建一条新记录并将其放置在一个新创建的数据页中,这个新数据页与之前的页结构没有什么不同,大小仍然是16k。
但要与之前的数据页区分开来。
页级信息添加到数据页中,从0开始向上计数。
所以页面之间就有了上下级的概念,如下图。
两层B+树结构突然看起来就像页面之间倒置的树。
这就是我们常说的B+树索引。
最底层的pagelevel为0,称为叶子节点,其余的称为非叶子节点。
上图是一个两层树。
如果数据变多了,我们可以用同样的方法再建一层或者更多。
它已经变成了一棵三层楼的树。
三层B+树结构现在我们可以通过这样的B+树来加速查询。
举个例子。
假设我们要查找第5行数据,我们将从第一页上的记录开始。
该记录包含主键id和页码(页地址)。
请看下图中的黄色箭头。
左边最小的id是1,右边最小的id是7。
如果id=5的数据存在,那么它一定在左边的箭头中。
那么我们顺着记录的页地址一直到数据页号6,然后判断id=5>4,这样就放到了右边的数据页上,所以数据页号105就会被加载。
在数据页中找到id=5的数据行,完成查询。
查询B+树时还需要注意的是,上述页面的页码不是连续的,它们在磁盘上不一定是相邻的。
在此过程中查询了三个页面。
如果这三个页面都在磁盘上(未预加载到内存中),则最多需要三个磁盘IO查询才能将它们加载到内存中。
B+树携带的记录数从上面的结构中我们可以看出,记录数据被放置在B+树的最后一个叶子节点中。
非叶节点包含用于加速查询的索引数据。
也就是说,对于同一个16k页,非叶子节点中的每一条数据都指向一个新页,而新页有两种可能。
假设计算出总行数,则这棵B+树的行数据总量等于(x^(z-1))*y。
如何计算x?我们回过头来看看数据页的结构。
页结构的非叶子节点主要存储与索引查询相关的数据,包括主键和指向页号。
假设主键为h3int(8Byte),页码称为源代码中的FIL_PAGE_OFFSET(4Byte),非叶子节点中的一部分数据大小约为12Bytes。
整页数据为16k,页眉和页脚的数据加起来约为128Byte。
包括页目录在内,估计总数为1k。
剩余的15k除以12Bytes将等于1280,这意味着它可以指向页面x=1280。
我们常说的二叉树是指一个节点可以分裂成两个新的节点。
m叉树的一个节点可以指向m个新节点。
这种指向新节点的操作称为扇出。
上面的B+树可以指向1280个新节点,这是惊人的。
在计算y时,叶子节点和非叶子节点的数据结构是相同的,所以也假设还剩下15kb可以传输。
实际的行数据放置在叶节点中。
假设一行数据为1kb,那么一页上可以放置y=15行。
总行数根据公式(x^(z-1))*y计算。
知道x=1280,y=15。
假设B+树有两个类,则z=2。
那么就是(1280^(2-1))*15≈2w。
假设B+树有三层,则z=3。
那么就是(1280^(3-1))*15≈2.5kw。
此2.5kw是2kw面板建议的最大行数的来源。
毕竟如果再加一层的话,数据就有点大了。
三层数据页最多对应三个磁盘IO,这是有道理的。