即时:Mysql高可用高性能存储应用系列1 - 索引篇
概述
在整个计算机运行系统里,Cpu,内存,和磁盘主要的性能瓶颈是卡在了读取数据中,Mysql索引的优化主要在减少磁盘I/O操作中,这篇博客中详细讲解了二叉树结构,以及BTree作为Mysql索引结构的根本原理,文章底部留下来几个常用的问题。
索引的本质
是帮助mysql高校获取数据的数据结构在mysql中,数据最终存储在硬盘中访问磁盘相当于是I/O操作,Mysql中有一个页(page)的概念,一个page就是树中的一个节点,每次Mysql就会取出一个page也就是一个节点的数据,而mysql默认一个page保存16k的数据。
二叉树
二叉树定义:
(资料图)
平衡二叉树定义:
相对平衡,左右两个子树的深度差 绝对值不能超过1左右两个子树也必须是平衡二叉树可以避免二叉树的极端情况B-Tree结构
特点:多叉(多阶)
1个节点可以存储查过2个元素,可以拥有超过2个子节点拥有二叉树的一些性质平衡,每个节点的所有子树高度一致,比较矮元素个数计算:
已知条件:m阶B树,最多拥有m个子节点,假设一个节点的存储元素个数为x。
根节点计算公式:1 <= x < m-1
非根节点(向上取整) ,计算公式:m/2 <= x <= m-1
子节点个数:y = x + 1
,根节点计算公式:2 <= y <= m
非根节点(向上取整) ,计算公式:m/2 <= y <= m
每个节点最多有m个子节点除根节点外,每个节点至少有m/2
个子节点,注意如果结果除不尽,就向上取整根节点要么为空,要么就独根,否则至少有2个子节点有K个子节点的节点必有k个关键词,就是有m个数据就有m个叉叶节点的高度一致单个节点可以保存多个数据,一次page可以获取更多的有效数据,同时因为分叉增多,数据层级肯定会更小,查询次数就会减少。
一个3层的Btree可以保存多少条数据呢?假设一条数据占用1k的空间(它的标识先可以忽略不计),3层的B-tree结构保存的数据条数:
16 * 16 * 16 = 4096
假如一个表中有500w数据,层级还是会很深,这样查询数据的时候,磁盘I/O还是会很多,(2)数据从小到大依次分布在树的不同层级中,进行范围查找时,获取范围越大,获取的节点就越多,极端情况下所有的数据全部遍历一遍,相当于遍历了整颗树,节点越多,I/O操作就会越多,性能就会卡主。
B+Tree
B+Tree解决了B-Tree结构存在的问题。
叶子节点保存数据信息,非叶子节点不保存节点保存的元素树等于m,并且是左闭右开叶子节点通过指针链接,方便范围查找,只需遍历叶子节点为什么Mysql使用B+Tree,而不使用B-Tree呢?叶子节点基于索引排序更优,非叶子节点不保存数据,保存索引数据更多,一次I/O获取更多的目标数据。最底层的数据结构属于双向链表,在做排序或者是范围查找的时候就会很方便,它不用遍历上面的节点。
Mysql具体如何使用
Myisam
*.frm 数据表的定义信息
*.myi 保存索引的信息
*.myd 保存数据文件
Innodb
*.frm 数据表的定义信息
*.ibd 保存了索引信息和数据信息
在Innodb引擎下,如果表没有创建主键索引,数据表会自动创建主键索引。
回表
回表,顾名思义就是回到表中,也就是先通过普通索引(我们自己建的索引不管是单列索引还是联合索引,都称为普通索引)扫描出数据所在的行,再通过行主键ID 取出索引中未包含的数据。所以回表的产生也是需要一定条件的,如果一次索引查询就能获得所有的select 记录就不需要回表,如果select 所需获得列中有其他的非索引列,就会发生回表动作。即基于非主键索引的查询需要多扫描一棵索引树。
Mysql回表指的是在InnoDB存储引擎下,二级索引查询到的索引列,如果需要查找所有列的数据,则需要到主键索引里面去取出数据。这个过程就称为回表。
有Id,Name,Age等等字段,Id和Name是索引,如果使用select Id,Name from Table
在索引项就直接返回了,如果使用select * from Table
当查询其他字段时就需要使用主键索引去获取数据,产生了多余的回表操作。
覆盖索引:可以考虑将查询的列创建组合索引,避免回表。
索引最左匹配原则
假如创建了name,age,address的索引,B+Tree结构是严格按照索引顺序去执行。
//使用到索引了Select * from user where name = ? AND age = ? AND address = ? //使用到索引了Select * from user where name = ?//使用到了索引但是只用到name的索引了Select * from user where name = ? AND address = ?
mysql索引面试题
1.mysql为什么不用二叉搜索树和平衡二叉树?
二叉搜索树相当于一个链表,极端情况,查询最后一条数据会遍历整个表,mysql每个节点的操作就是对磁盘的一个I/O操作,而平衡二叉树虽然避免了极端情况,但是一个节点只能保存一个元素,这样就会导致每一个节点保存的数据比较少,I/O操作增多,影响性能。
2.mysql为什么用B+tree,不用B-Tree?
1)叶子节点有指针关联,当进行排序和范围查找时,效率也会更高,它不会查询所有的节点,这样基于索引的扫表就会更优,基于索引的排序也会更优。
2)子节点中不保存数据信息,只保存标识信息和指针信息,这样在同一个page结构中保存的数据就会更多,减少磁盘I/O。
3.mysql为什么不选择使用B-Tree?
根据计算,3层的B-Tree树保存的数据还是很少,数据从小到大依次分布在数的不同层级中,进行范围查找时,获取范围越大,获取的节点就越多。
极端情况下,相当于遍历了整棵树,节点越多获取的次数就越多,I/O操作就会越多,这样性能就会遇到瓶颈。
4.mysql为什么不建议用uuid当主键?
5.为什么建议主键ID是递增的,和B+Tree有什么关系?
1) 因为B+Tree在创建索引是按照顺序从小到大创建的,并且把相临的节点放置在同一个page中,保证一个page的充分利用,减少分叉(也就是减少了检索次数)。
2) UUid是没有任何规律的,造成了Page的浪费,Btree会因为存储结构不合理,导致节点增多,所以不会用UUid当主键。
6.为什么不建议使用select * from Table语句查询数据?
有Id,Name,Age等等字段,Id和Name是索引,如果使用select Id,Name from Table
在索引项就直接返回了,如果使用select * from Table
当查询其他字段时就需要使用主键索引去获取数据,产生了多余的回表操作。
7.为什么Innodb引擎要求一定要建立主键索引?
这是由Innodb特殊引擎结构决定的,Innodb引擎数据存储在主键ID下面
8.索引最左匹配原则
假如创建了name,age,address的索引,B+Tree结构是严格按照索引顺序去执行。
//使用到索引了Select * from user where name = ? AND age = ? AND address = ? //使用到索引了Select * from user where name = ?//使用到了索引但是只用到name的索引了Select * from user where name = ? AND address = ?
标签:
为您推荐
广告
- 即时:Mysql高可用高性能存储应用系列1 - 索引篇
- 环球热点!三美股份:3月21日融资买入1884.35万元,融资融券余额4.32亿元
- 4399爆枪英雄手机版叫什么名字_4399爆枪英雄账号密码真的99级号 观天下
- 弥勒重要签约!将新建一大型园区!
- 足协官宣清欠名单,被批掩耳盗铃,无视体育总局发声,死性不改 焦点讯息
- 赛后拒绝谢场!梅西遭痛批:输球要背锅,还要我说谢谢你?|全球速讯
- 东威科技:发行GDR并在瑞士证券交易所上市申请事宜获中国证监会批复
- 每日看点!568b和568a区别_568b
- 当前要闻:华州区农村信用合作联社 开展团体心理拓展活动
- 今日快看!孝义市东庄村:为乡村振兴注入“数字”动能
- 欧科亿:3月20日融资买入307.99万元,融资融券余额1.7亿元-天天速看
- 广汇汽车(600297):3月20日北向资金增持12.89万股|精选
- 天天热点评!圆周率是怎么算出来的_圆周率的由来
- 吃火锅为何还会感染甲肝?吃之前注意3个细节,能减少被感染风险|世界热门
- 招商蛇口:2022年归母净利润为42.6亿元,同比下降58.9% 当前消息
- 公牛重磅推出新品牌!沐光无主灯全球首发!
- 中亚股份:公司目前没有在预制菜方面提供设备技术服务-当前要闻
- 天天新消息丨oppo最新款手机是什么型号多少钱_oppo最新款手机是什么型号
- 有条理的人更抗压_环球精选
- Docker - docker-compose搭建ELK服务
- 1快报:迪士尼预计4月将裁员4000人
- 2【天天聚看点】山前庄村
- 327寸显示器有多大长宽各是多少_27寸显示器有多大 世界热推荐
- 4综述提纲格式范文大全(实用10篇)
- 5【天天新视野】天山脚下的春天 “一马当先”跑出致富“加速度”
- 6尪字找出17个字_尪|天天热议
- 7南宁港港区3000吨级航道全线贯通
- 8lol内置语音连不上怎么弄_lol内置语音连不上
- 9每日讯息!高中数学备课组工作计划_数学教研组计划
- 10Eletre交付在即,成都路特斯中心正式启幕,加速布局西南市场 世界速看料
- 1安吉白茶属于什么茶(安吉白茶属于什么品种呢)_天天动态
- 2阳了应该怎么办-阳性感染者如何用药 03月18日10时山西太原疫情数据 全球播资讯
- 3用妈妈的声音唤醒孩子的烟感报警器比高音报警器好 全球快看
- 4全球热门:肠胃炎饮食吃些什么好_肠胃炎饮食要吃什么好
- 5天天即时看!标准vga图形适配器怎么更改驱动_标准vga图形适配器
- 6八美肉是什么意思_bmr是什么意思|每日速读
- 7南华集团控股(00413.HK)盈喜:预计2022年度溢利将增加近100%
- 8格林达:公司产品少量应用于太阳能电池领域
- 9【天天时快讯】延吉市延西桥西北广场改造项目进入绿化提升阶段 扮靓“沿河”广场 共享“绿色”空间
- 10否极泰来英文extreme,adversity,prosperity
广告
- 续航超1000公里!预售订单破千骏铃聚宝盆才是真香之选?
- 钢筋理论重量公式如何推导出来的_求钢筋 型钢等的理论重量计算公式 当前观察
- 新能源车经济实用颜值在线|天天速看
- 中俄管道开始谈价格了,普京提的要求是,希望中方给个好价钱 全球热推荐
- 工信部修订印发《国家工业遗产管理办法》
- 环球时讯:盗墓笔记—戚麟 かごめ中文填词
- 大连通报3起破坏营商环境问题|每日信息
- 天天热点评!怎样除去抬头纹女生_怎样除去抬头纹
- 三亚:畅享“玫”好时光
- 电视剧赘婿几点更新_电视剧赘婿的简介
- 天天即时看!茉莉花叶子打蔫是咋回事 茉莉花的叶子发蔫怎么解决
- 廊坊消费广场招聘信息纸质版_廊坊消费广场招聘信息 世界今亮点
- 简讯:贝莱德首席执行官警告称:硅谷银行倒闭后,美国地区银行业仍面临风险
- WTT新加坡大满贯赛:孙颖莎、王曼昱晋级 马龙赢下“国乒内战”
- 海南机场2月旅客吞吐量235.16万人次,同比增长12.32%
- 家用摄像机选购_教你怎样选购摄像机 世界讯息
- CBA常规赛上海再战辽宁!3月15日晚直播在哪看?
- 女子睡觉时被10厘米蜈蚣咬太阳穴 被蜈蚣咬了会有生命危险吗
- 我磕了对家x我的cp广播剧cv(我磕了对家x我的cp广播剧)
- 全球通讯!团队的管理策略是什么_团队管理五个基本要素