网站架构图用什么画,c2c模式特点,如何给网站加cdn,qplayer wordpress参考#xff1a;https://www.zhihu.com/question/351797203/answer/3137174084
1.MySQL innodb单表上限为啥都说是2k万条
2.GaussDB for MySQL 为啥可以突破单表2k万的限制
要讨论这两个问题#xff0c;得先明确性下实际的DB部署环境
表是索引数据是放在磁盘上的#xf…参考https://www.zhihu.com/question/351797203/answer/3137174084
1.MySQL innodb单表上限为啥都说是2k万条
2.GaussDB for MySQL 为啥可以突破单表2k万的限制
要讨论这两个问题得先明确性下实际的DB部署环境
表是索引数据是放在磁盘上的
如果MySQL的在InnoDB buffer size大小可以把表的索引数据可以完全加载进内存那么单表数据的限制就是磁盘的大小了哈。
这里我们假设索引数据直接从磁盘查询那么磁盘操作就是对我们的最大影响。
问题1
MySQL Innodb采用B树索引
当B树的层次为3每条记录1K一般能存储2k万左右这个就是单表2k万的由来
当B树的层次为4会增加1次磁盘IO单表能存2 百亿条影响性能也需要看下有没有必要 问题2
BTree操作非原子所以当一个线程做结构调整SMOStruction-Modification-Operation时一般会涉及多个节点的改动。
SMO动作过程中此时若有另一个线程进来可能会访问到错误的BTree结构InnoDB为了解决这个问题采用了乐观锁和悲观锁的并发控制协议。
目前业界有一个更好的方案B-Link Tree与BTree相比B-Link Tree优化了BTree结构调整时的锁粒度只需要逐层加锁无需对root节点加全局锁。因此可以做到在SMO过程中写操作的并发执行保持高并发下性能的稳定。
B-Link Tree主要改进点有2个
1.中间节点增加link指针指向右兄弟节点
2.每个节点内增加字段high key存储该节点中最大的key值。 说明
MySQL Innodb采用B树索引
假设
非叶子节点内指向其他页的数量为 x叶子节点内能容纳的数据行数为 yB 数的层数为 z Total x^(z-1) *y 也就是说总数会等于 x 的z-1 次方 与Y 的乘积。
作者京东云 链接https://www.zhihu.com/question/351797203/answer/2595667438 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
X
在文章的开头已经介绍了页的结构索引也也不例外都会有File Header(38 byte)、Page Header (56 Byte)、Infimum Supermum26 byte、File Trailer8byte,再加上页目录大概1k 左右我们就当做它就是1K,那整个页的大小是16K,剩下15k用于存数据在索引页中主要记录的是主键与页号主键我们假设是Bigint(8 byte),而页号也是固定的4Byte,那么索引页中的一条数据也就是12byte; 所以x15*1024/12≈1280 行。
Y
叶子节点和非叶子节点的结构是一样的同理能放数据的空间也是15k但是叶子节点中存放的是真正的行数据这个影响的因素就会多很多比如字段的类型字段的数量每行数据占用空间越大页中所放的行数量就会越少这边我们暂时按一条行数据1k 来算那一页就能存下15条Y≈15。
算到这边了是不是心里已经有谱了啊 根据上述的公式Total x^(z-1) y已知 x1280,y15假设B 树是两层那就是Z 2 Total 1280 ^1 15 19200 假设B 树是三层那就是Z 3 Total 1280 ^2 *15 24576000 约2.45kw
哎呀妈呀 这不是正好就是文章开头说的最大行数建议值 2000w嘛对的一般B 数的层级最多也就是3层你试想一下如果是4层除了查询的时候磁盘IO次数会增加而且这个Total 值会是多少大概应该是3百多亿吧也不太合理所以3层应该是比较合理的一个值。