本文需要有mysql底层知识做铺垫

****mysql默认page大小为16K,这个可以调整,但是必须是4的倍数,因为操作系统每次和硬盘交互数据取的就是4K的块

1、分析b+树非叶子节点情况 ,假定一个表用int类型作为主键,占用4个字节,而指针大小在InnoDB源码中设置为6字节,一共10个字节,根节点一页就能存放16K/10 约为1600个指针

满编的B+树一层能存放的指针数据为1600*1600 约为256W条数据,二层大约为4亿数据。

此时B+树高度为4,因为有叶子节点的存在。假定数据表一行实际数据为1k大小(一行数据差不多就是那么大吧,估摸着),叶子结点每一页(page)大概可以放16条数据。所以最终能够放进去的数据为4亿*16,大约64亿行。此时,int主键已经超过最大范围。而且每次查询数据走索引的时候需要经过4次io。所以建议将数据约束在三层树结构中,根节点+一层非叶子节点+二层非叶子节点+三层数据节点。按一条数据1k长度,可存储行数为256W*16 约为 4000w 左右。所以int型主键建议将数据行数约束在4000w以内。超过该界限将会增加一次io。

2、分析b+树非叶子节点情况 ,假定一个表用bigint作为主键 ,占用8个字节,加上指针的6个字节一用14个字节,用16k 16384/14约为1170。那么可以算出一棵高度为2的B+树,能存放1170*16=18720条这样的数据记录。高度为3 1170*1170*16=21902400左右,高度为4的时候 大概是256亿条数据(这些数据大约需要占24T 的硬盘大小 =  =!千万别用自己的电脑试)。所以将bigint型主键的表数据不超过2000w是比较靠谱的选择。

----------------------------------

block size 的概念   数据库引擎每次从磁盘取数据按照page 为单位去取, mysql 默认为16K  ,oracle好像是8K。mysql不能通过命令行修改默认页大小,如果必要修改情况下请参考下面链接

----------------------------------------------------------------------------------------------------------------------------------

结论:mysql 默认page16K按照 数据量计算层高的方法:h = (16*1024)/(L1+6)           (16*1024)/L2   算了,有空再写这个公式

可以使用下面这段代码预估树的层高,请不要吐槽代码优雅性。赶着写的

package test;import java.util.*;public class Test1 {public static void main(String[] args) {int l1 = 1024;    //一行数据大小,单位Byte   (各个字段的所占字节数加起来)int l2 = 8;       //主键所占字节 单位Byte     (主键所占的字节数)double num = 2190200;  //数据表行数int page = 16*1024;  //KB  page页大小,单位Byte //mysql默认的页大小,基本不用修改Test1 test1 = new Test1();List<Double> max = test1.max(l1, l2, page);System.out.println(max.toString());int high = test1.high(l1, l2, num, page);System.out.println(num+"这么多行数据 树层高为"+high);if(high>0&&high<=2){System.out.println("您的数据库按索引查询速度效率优秀");}else if(high>2&&high<=3){System.out.println("您的数据库按索引查询速度效率还行");}else if(high>3&&high<=4){System.out.println("您的数据库按索引查询速度效率一般,可以考虑水平分表");}else if(high>4){System.out.println("老铁,你这表该分表了,数据太多了");}else {System.out.println("GG");}}public int high(int l1 , int l2 , double num,int page){if (num<1){return 0;}List<Double> max = max(l1, l2, page);for (int i = 0 ; i < max.size() ; i++){if(max.get(i)>=num){return i+1;}}return 0;}public List<Double> max(int l1 , int l2 , int page){//l2等于主键长度+指针大小6l2 = l2+6;//单页能存的数据个数int num1 = page / l1;//单页能存主键+指针的个数long num2 = (long)(page / l2);List<Double> list  = new ArrayList<Double>();list.add((double) num1);double pow = Math.pow(num2, 1);list.add(num1*Math.pow(num2,1));list.add(num1*Math.pow(num2,2));list.add(num1*Math.pow(num2,3));list.add(num1*Math.pow(num2,4));return list;}
}

注意:本文完全为作者个人意淫,并没有做实际实验,看看即可。

参考:https://www.cnblogs.com/leefreeman/p/8315844.html   InnoDB一棵B+树可以存放多少行数据?

https://www.jb51.net/article/65796.htm    修改Innodb的数据页大小以优化MySQL的方法

mysql B+树层高计算《嘀嗒出行面试》相关推荐

  1. 顺风车订单已结束仍在录音 嘀嗒出行回应录音机制

    4月25日消息,针对乘客反映的顺风车订单已经结束仍在录音的问题,嘀嗒出行官微做出回应. 嘀嗒出行回应称,若乘客未主动关闭录音,行程开始后,系统会综合判定车主.乘客定位与终点距离,通过对多种因素的计算之 ...

  2. 聚观早报 | 嘀嗒出行重启赴港IPO;饿了么到店业务将与高德合并

    点击蓝字 / 关注我们今日要闻:嘀嗒出行重启赴港 IPO:饿了么到店业务将与高德合并:美团香港骑手月收入高达3.5万港元:腾讯或引进Meta旗下VR眼镜Quest 2:苹果将阻止用户免费装开测版iOS ...

  3. 嘀嗒出行再闯IPO:千军万马我无懈

    羽扇纶巾笑谈间,千军万马我无懈. 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行,闪露出一丝歌词里的气魄.交通运输部下属网约车监管信息交互系统的数据显示,截至2023年1月31日,全国共有300家网约车平 ...

  4. 嘀嗒出行4年未获新融资,市场、法规双压下亟待上市自救

    作者:潘妍 出品:洞察IPO 距嘀嗒出行去年10月首次向港交所递交招股书半年后,其招股书于2021年4月8日被列为"失效"状态.但仅过短短5日,嘀嗒出行便"火速" ...

  5. 二冲港交所,嘀嗒出行“顺风车领头羊”的故事真的动听吗?

    天花板越走越窄的嘀嗒出行,"二战"港交所能成功吗? 一直以"小而美"模式生存于共享出行赛道上的嘀嗒出行,重新向港交所递交招股书.招股书显示,在2019年,嘀嗒出 ...

  6. 嘀嗒出行IPO:营收三年翻12倍,累计受到77次行政处罚

    嘀嗒出行IPO:营收三年翻12倍,累计受到77次行政处罚 出品 l 观点财经 作者 l 大钊 2010年至今,中国互联网出行服务市场众多玩家先后崛起,但部分参与者历经洗牌后随之出局. 10年生死鏖战之 ...

  7. 巨头IPO光环下的嘀嗒出行: 起个大早二度递表 营收不足滴滴0.6%

    作者 | 观察团 来源 | 金融观察团 今年二季度,国内共享出行领域迎来了上市高峰期.6月11日,巨头滴滴终于递交了招股书,正式启动上市步伐,加入"共享出行第一股"的争夺战.市场预 ...

  8. 拆解嘀嗒出行赴港IPO招股书:顺风车市占率近七成 2019年起实现盈利

    10月9日,共享出行第一股要来了. 10月8日,嘀嗒出行正式向香港交易所公开递交招股书,拟在港交所挂牌上市,海通国际资本有限公司及野村国际(香港)有限公司为联席保荐人. 招股书显示,嘀嗒出行拥有顺风车 ...

  9. 嘀嗒出行被曝五一活动虚假宣传,官方回应:为打击黑产

    刚刚过去的五一假期期间,嘀嗒出行推出了五一集卡活动,邀请好友助力可得现金奖励,达到100元即可提现,提现时间为5月7日. 不过,有网友反馈,到5月7日却无法完成提现,显示账号不安全,不可参与活动.还有 ...

最新文章

  1. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别
  2. MyBatis(四)MyBatis插件原理
  3. 编写声卡驱动(框架)
  4. 随机生成关于银行卡号的字典(卡号以6102009开头,后面依次是001,002,...)
  5. HTML5 中Web存储问题
  6. tcpdump 不显示指定ip_wordpress首页不显示指定分类文章的方法
  7. Python 数据结构与算法 —— Kruskal 算法
  8. 初中女生数学不好能学计算机,初中数学成绩好的女生,多半有这3个“小特征”,学渣可装不来!...
  9. 安装和客户端证书颁发---puppet系列
  10. Python的程序结构[2] - 类/Class[1] - 基类与继承
  11. CPC客户端从写作到提交成功的巨坑
  12. NTC热敏电阻的时间常数
  13. 配置ip地址常用命令及解释
  14. Git Commit 规范以及emoji 使用指南
  15. 论文解读:Combining Distant and Direct Supervision for Neural Relation Extraction
  16. python自动翻译导学案_变量python学案
  17. 数字孪生 智慧工厂可视化决策系统
  18. 市场调研报告-全球与中国关键字研究工具市场现状及未来发展趋势
  19. 如何设计安全可靠的开放接口---之AppId、AppSecret
  20. 交换机端口假死(err-disable)解决方法

热门文章

  1. 多线程编程学习笔记1时间
  2. 使用病毒式营销策划推广方案
  3. tsm linux文件备份命令,tsm 命令行参考
  4. 让U盘不再中病毒的方法
  5. 读书:哲学家们都干了些什么
  6. IJCAI2023模板pdfinfo报错
  7. TL431在电源方面的应用
  8. DEM数据全国各省的裁剪与分享(30m、90m、250m、1000m)
  9. 智慧记的那些事儿(三)
  10. 【Unity+HoloLens2】从0开始在HoloLens2部署MR工程