Mysql为什么只能支持2000w左右的数据量?
一、Mysql为什么只能支持2000w左右的数据量
简而言之,是B+树的层数问题。
假设表中一行记录的数据大小为1k(实际上现在很多互联网业务数据记录大小通常就是1K左右)
所以(主键索引中)叶子节点的一个节点(即一个page,且为数据页),在这里认为可以放16行记录.
假设主键ID为bigint类型(长度为8字节),而指针大小在InnoDB源码中是6字节,这样一共14字节,我们一个页(Page,在此为目录页)中能存放多少这样的(索引)单元,其实就代表有多少指针,即16384/14=1170。即一个目录Page,能存大概1170个(索引)单元.
那么可以算出一棵高度为2的B+树,能存放1170*16=18720条这样的数据记录。
根据同样原理, 可以算出一个高度为3的B+树可以存放:1170*1170*16=21902400条这样的记录。
所以在InnoDB中B+树高度一般为1-3层,就能满足千万级的数据存储。在查找数据时一次页的查找代表一次磁盘IO,所以通过主键索引查询通常只需要1-3次IO操作即可查找到数据。
所以如果 表A的数据行数为600多万,B+树高度为3;表B的数据行数只有15万,B+树高度也为3。可以看出尽管数据量差异较大,这两个表树的高度都是3,换句话说这两个表通过索引查询效率并没有太大差异,因为都只需要做3次IO。如果有一张表行数是一千万,那么其B+树高度依旧是3,查询效率仍然不会相差太大。
当然如果一张表只有5行数据,那么它的B+树高度为1。
即当数据量在18720到21902400行之间时,B+树的高度都是3,查询的速度几乎相同.
因为二分查找是在内存里边进行的,速度很快.和磁盘IO差几个数量级,可以忽略. 那么即从2万行记录到2200万行记录,主体的查询性能差不多。
延伸阅读:
二、数据库的查询功能实现原理
数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优异的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

猜你喜欢LIKE
相关推荐HOT
更多>>
Sequel Pro的Windows版替代品及优缺点是什么?
一、Sequel Pro的Windows版替代品及优缺点通过客户端方式的,免费的有MySQL Workbench,MySQL官方出品;收费的有Navicat,挺出名的也挺好用。通...详情>>
2023-10-20 23:39:05
对于大流量的网站,采用什么样的方法来解决各页面访问量统计问题?
一、对于大流量的网站解决各页面访问量统计问题的方法1、使用日志分析工具日志分析工具可以记录每一个用户访问网站的请求,并根据相应的日志信...详情>>
2023-10-20 22:41:13
为什么不推荐使用try-with-finally处理Java异常?
一、不推荐使用try-with-finally处理Java异常的原因1、代码冗余使用 try-with-finally 时,需要在 finally 块中编写释放资源的代码,这可能导致...详情>>
2023-10-20 21:12:04
KVO的本质是什么?
一、KVO的本质KVO(Key-Value Observing)是指在软件开发中一种观察者模式的实现,它允许对象监听其他对象特定属性的变化,并在属性值发生改变...详情>>
2023-10-20 20:38:54热门推荐
Sequel Pro的Windows版替代品及优缺点是什么?
沸SQL/Oracle数据库是怎样与GIS的应用相联系起来的?
热对于大流量的网站,采用什么样的方法来解决各页面访问量统计问题?
热常见的软件设计模式有哪些?
新Mysql为什么只能支持2000w左右的数据量?
为什么不推荐使用try-with-finally处理Java异常?
KVO的本质是什么?
Java中CycliBarriar和CountdownLatch的区别?
为什么列存储数据库读取速度会比传统的行数据库快?
为什么要学IO模型?
LayoutInflater.inflate()方法两个参数和三个参数的区别?
Python传参传什么?
为什么GIL让多线程变得如此鸡肋?
web前端开发学习路线?
技术干货






