mysql innodb索引原理

聚集索引(clustered index)

innodb存储引擎表是索引组织表,表中数据按照主键顺序存放。其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这些叶子节点成为数据页。

聚集索引的存储并不是物理上连续的,而是逻辑上连续的,叶子结点间按照主键顺序排序,通过双向链表连接。多数情况下,查询优化器倾向于采用聚集索引,因为聚集索引能在叶子结点直接找到数据,并且因为定义了数据的逻辑顺序,能特别快的访问针对范围值的查询。

聚集索引的这个特性决定了索引组织表中的数据也是索引的一部分。由于表里的数据只能按照一颗B+树排序,因此一张表只能有一个聚簇索引。

在Innodb中,聚簇索引默认就是主键索引。如果没有主键,则按照下列规则来建聚簇索引:

  • 没有主键时,会用一个非空并且唯一的索引列做为主键,成为此表的聚簇索引;
  • 如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

由于主键使用了聚簇索引,如果主键是自增id,那么对应的数据也会相邻地存放在磁盘上,写入性能较高。如果是uuid等字符串形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

B+树(多路平衡查找树)

我们知道了innodb引擎索引使用了B+树结构,那么为什么不是其他类型树结构,例如二叉树呢?

计算机在存储数据的时候,有最小存储单元,这就好比人民币流通最小单位是分一样。文件系统的最小单元是块,一个块的大小是4k(这个值根据系统不同并且可设置),InnoDB存储引擎也有自己的最小储存单元—页(Page),一个页的大小是16K(这个值也是可设置的)。

文件系统中一个文件大小只有1个字节,但不得不占磁盘上4KB的空间。同理,innodb的所有数据文件的大小始终都是16384(16k)的整数倍。

所以在MySQL中,存放索引的一个块节点占16k,mysql每次IO操作会利用系统的预读能力一次加载16K。这样,如果这一个节点只放1个索引值是非常浪费的,因为一次IO只能获取一个索引值,所以不能使用二叉树。

B+树是多路查找树,一个节点能放n个值,n = 16K / 每个索引值的大小。
例如索引字段大小1Kb,这时候每个节点能放的索引值理论上是16个,这种情况下,二叉树一次IO只能加载一个索引值,而B+树则能加载16个。

B+树的路数为n+1,n是每个节点存在的值数量,例如每个节点存放16个值,那么这棵树就是17路。

从这里也能看出,B+树节点可存储多个值,所以B+树索引并不能找到一个给定键值的具体行。B+树只能找到存放数据行的具体页,然后把页读入到内存中,再在内存中查找指定的数据。

附:B树和B+树的区别在于,B+树的非叶子结点只包含导航信息,不包含实际的值,所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历。

辅助索引

也称为非聚集索引,其叶子节点不包含行记录的全部数据,叶子结点除了包含键值以外,每个叶子结点中的索引行还包含一个书签,该书签就是相应行的聚集索引键。

如下图可以表示辅助索引和聚集索引的关系(图片源自网络,看大概意思即可):

当通过辅助索引来寻找数据时,innodb存储引擎会通过辅助索引叶子节点获得只想主键索引的主键,既然后再通过主键索引找到完整的行记录。

例如在一棵高度为3的辅助索引树中查找数据,那需要对这颗辅助索引树进行3次IO找到指定主键,如果聚集索引树的高度同样为3,那么还需要对聚集索引树进行3次查找,最终找到一个完整的行数据所在的页,因此一共需要6次IO访问来得到最终的数据页。

创建的索引,如联合索引、唯一索引等,都属于非聚簇索引。

联合索引

联合索引是指对表上的多个列进行索引。联合索引也是一颗B+树,不同的是联合索引的键值数量不是1,而是大于等于2。

例如有user表,字段为id,age,name,现发现如下两条sql使用频率最多:

Select * from user where age = ? ;
Select * from user where age = ? and name = ?;

这时候不需要为age和name单独建两个索引,只需要建如下一个联合索引即可:

create index idx_age_name on user(age, name)

联合索引的另一个好处已经对第二个键值进行了排序处理,有时候可以避免多一次的排序操作。

覆盖索引

覆盖索引,即从辅助索引中就可以得到查询所需要的所有字段值,而不需要查询聚集索引中的记录。覆盖索引的好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。

例如上面有联合索引(age,name),如果如下:

select age,name from user where age=?

就能使用覆盖索引了。

覆盖索引的另一个好处是对于统计问题,例如:

select count(*) from user

innodb存储引擎并不会选择通过查询聚集索引来进行统计。由于user表上还有辅助索引,而辅助索引远小于聚集索引,选择辅助索引可以减少IO操作。

注意事项

  • 索引只建合适的,不建多余的

因为每当增删数据时,B+树都要进行调整,如果建立多个索引,多个B+树都要进行调整,而树越多、结构越庞大,这个调整越是耗时耗资源。如果减少了这些不必要的索引,磁盘的使用率可能会大大降低。

  • 索引列的数据长度能少则少。
索引数据长度越小,每个块中存储的索引数量越多,一次IO获取的值更多。
  • 匹配列前缀可用到索引 like 9999%,like %9999%、like %9999用不到索引;
  • Where 条件中in和or可以使用索引, not in 和 <>操作无法使用索引;
如果是not in或<>,面对B+树,引擎根本不知道应该从哪个节点入手。
  • 匹配范围值,order by 也可用到索引;
  • 多用指定列查询,只返回自己想到的数据列,少用select *;
不需要查询无用字段,并且不使用*可能还会命中覆盖索引哦;
  • 联合索引中如果不是按照索引最左列开始查找,无法使用索引;
最左匹配原则;
  • 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引;
  • 联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索

#阿里云开年Hi购季#幸运抽好礼!
点此抽奖:https://www.aliyun.com/acts/product-section-2019/yq-lottery?utm_content=g_1000042901

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp文字上下居中显示_微信朋友圈又有骚技巧,一键设置居中签名,好友傻眼了...

今日推荐&#xff1a;微信朋友圈签名居中适用&#xff1a;安卓、苹果大家好我是小雷&#xff0c;又来给大家安利微信小技巧了&#xff0c;今天给大家分享如何让你的朋友圈签名居中显示。熟悉微信的朋友都知道&#xff0c;在微信设置了个性签名之后&#xff0c;往往会同步到朋友…

云+X案例展 | 传播类:k3s基于逾百台工控机的应用实践

本案例由Rancher投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。随着国家政策的导向&am…

从大山走出的阿里首席通信科学家,这次要重返课堂

阿里巴巴首席通信科学家谢崇进与学生们交流 “我是一位没上过大学的科学家”&#xff0c;谢崇进在公益课堂上说。讲台下&#xff0c;是450位将要面临高考的乡村学生。 不久前&#xff0c;阿里巴巴首席通信科学家谢崇进通过网络视频的方式开课&#xff0c;向广东省汕头市潮南区…

MySQL 8.0.26 图形化安装教程 (windows 64位)

文章目录mysq8 比mysql5.7快2倍mysql8官网&#xff1a; https://dev.mysql.com/downloads/windows/installer/8.0.html 双击安装mysql-installer-community-8.0.21.0.msi

8s存储最佳方案_MaxiDi, 意大利:自动化物流解决方案

Maxi Di是Selex商业集团的成员&#xff0c;该集团在意大利拥有2500多家门店&#xff0c;是意大利最大的零售商之一。 由于公司的快速发展&#xff0c;其中央仓的存储容量很快面临饱和&#xff0c;公司不得不租用多个外部仓库以满足供应链的需求。 这导致高昂的租金成本以及库存…

程序员如何让自己 Be Cloud Native - 配置篇

前言 这是《程序员如何让自己 Be Cloud Native》系列文章的第二篇&#xff0c;从第一篇的反馈来看&#xff0c;有些同学反馈十二要素太形式主义&#xff0c;不建议盲目跟从。作者认为任何理论和技术都需要有自己的观点&#xff0c;这些观点是建立在个体知识体系逐渐锻炼出来的…

云+X案例展 | 传播类:南方报业数据中台建设,助力“智媒”飞跃发展

本案例由百分点投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。南方报业传媒集团在半个…

读取扫码枪输入_为何超市“扫码枪”这么强?不输密码钱就没了,现在知道还不晚...

点上面蓝色字免费关注!随着互联网的产生&#xff0c;我们的生活也发生了很大的变化&#xff0c;不仅变得更加便利&#xff0c;生活也变得丰富多彩一些&#xff0c;而有了网络之后&#xff0c;移动支付也应运而生&#xff0c;我们的支付方式也发生了很大的改变。如今只要携带一部…

助力深度学习!阿里开源可插拔 GPU 共享调度工具

根据 Gartner 对全球 CIO 的调查结果显示&#xff0c;人工智能将成为 2019 年组织革命的颠覆性力量。对于人工智能来说&#xff0c;算力即正义&#xff0c;成本即能力&#xff0c;利用 Docker 和 Kubernetes 代表云原生技术为 AI 提供了一种新的工作模式&#xff0c;将 GPU 机器…

使用maven 创建Quartz 任务示例_01

文章目录1. 创建maven项目2. 添加Quartz 依赖3. 编写Quartz配置文件4. 编写Job实现类5. 编写main函数&#xff0c;创建Scheduler6. 创建JobDetail7. 编写Trigger&#xff0c;添加JobDetail8. 启动main函数&#xff0c;体验Quartz定时任务Quartz 支持集群&#xff0c;但不支持分…

git commit提交代码时提示LF与CRLF转换问题 error

在用idea提交Vue项目的时候遇到报错&#xff0c;提示LF will be replaced by CRLF。 然后查了很多博客&#xff0c;都解释了LF和CRLF的问题&#xff0c;基本上说的解决办法是运行这行代码&#xff1a;git config --global autocrlf 运行结果为 true但这个本来就是默认设置&…

2019阿里云开年Hi购季大促主会场全攻略!

2019阿里云云上采购季活动已经于2月25日正式开启&#xff0c;从已开放的活动页面来看&#xff0c;活动分为三个阶段&#xff1a; 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 整个大促活动包含1个主会场…

云+X案例展 | 民生类:肯耐珂萨入围腾讯SaaS加速器首期成员名单

本案例由肯耐珂萨投递并参与评选&#xff0c;CSDN云计算独家全网首发&#xff1b;更多关于【云X 案例征集】的相关信息&#xff0c;点击了解详情丨挖掘展现更多优秀案例&#xff0c;为不同行业领域带来启迪&#xff0c;进而推动整个“云行业”的健康发展。腾讯产业加速器新推出…

c++ 指针拼接字符串_字符串拼接+和concat的区别

和concat都可以用来拼接字符串&#xff0c;但在使用上有什么区别呢&#xff0c;先来看看这个例子。public static void main(String[] args) {// example1String str1 "s1";System.out.println(str1 100);//s1100System.out.println(100 str1);//100s1String str2…

JobDataMap传递参数_02

JobDataMap属于JobDetail的一部分 可以在构建JobDataMap时传递参数 取出参数2种形式&#xff1a; 第1种&#xff1a;可以从execute方法的上下文中取出参数 第2种&#xff1a;在Job类中&#xff0c;定义参数名称&#xff0c;完成getset方法 推荐使用第2种lombok 添加参数 //创…

如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招

阿里妹导读&#xff1a;现代人离不开手机&#xff0c;更离不开Wi-Fi。很多同学经常吐槽家中Wi-Fi用得不爽&#xff0c;打游戏看视频又卡又慢。 针对大家常见的问题&#xff0c;和坊间各种“谣传”&#xff0c;今天我们特别邀请了阿里工程师艺超&#xff0c;来为大家做全面的梳…

建议看 | 计算机网络核心概念

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | cxuan责编 | 阿秃本篇文章我们来探讨一下网络核心、交换网络、时延、丢包、吞吐量以及计算机网络的协议层次和网络攻击。网络核心网络的核心是由因特网端系统和链路构成的网状网络&#xff0c;下面这幅图正确的表达了这一点。…

配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景

应用配置管理&#xff08;Application Configuration Management&#xff0c;简称 ACM&#xff09;是一款应用配置中心产品。基于ACM您可以在微服务、DevOps、大数据等场景下极大地减轻配置管理的工作量&#xff0c;同时保证配置的安全合规。ACM 有着丰富的使用场景&#xff0c…

定时任务的并发_03

正常定时任务场景 任务1从第0秒开始执行&#xff0c;执行3秒结束 任务1再从第5秒开始执行&#xff0c;执行3秒结束&#xff0c;以此类推 每一个任务执行都不会有冲突&#xff0c;都不会有干扰&#xff0c;在规定的5秒时间内&#xff0c;任务1都能执行完成 定时任务的并发场景…

2019阿里云开年Hi购季云通信分会场全攻略!

2019阿里云云上Hi购季活动已经于2月25日正式开启&#xff0c;从已开放的活动页面来看&#xff0c;活动分为三个阶段&#xff1a; 2月25日-3月04日的活动报名阶段、3月04日-3月16日的新购满返5折抢购阶段、3月16日-3月31日的续费抽豪礼5折抢购阶段。 做为整个Hi购季非常重要的一…