(一)关于索引

索引是帮助Mysql更加高效获取数据的一种数据结构,索引的使用很简单,但是如果不能理解索引底层的数据结构的话,就谈不上去优化索引了。

(二)B+树

Mysql的索引用的是B+树,他具有这样的几个特点:

1、数据都存储在叶子节点中、非叶子节点只存储索引

2、叶子节点中包含所有的索引

3、每个小节点的范围都在大节点之间

4、叶子节点用指针相连,提高访问性能,比如条件是>或者<的查询就可以直接按指针找(Mysql中的B+树叶子节点中的指针是双向指针)

B+树的数据结构如图所示,首先非叶子节点只存储索引,且每个指针所指向的节点最左边的索引都是该指针对应的索引值,比如头节点的第一个索引值8,指向的非叶子节点的第一个索引值也是8。

(三)为什么索引这么快?

索引可以支撑千万级表的快速查找,为什么呢?下面就来解释一下:

show GLOBAL STATUS like 'Innodb_page_size'

在Innodb中,默认的innodb_page_size大小为16kb,这就相当于上面每一个节点的大小默认情况下是16kb。一个索引值的大小为8B,索引后的指针所占大小为4B,因此可以解算出一个节点中大约可以存储1170个索引。

对于叶子节点,由于存储了数据,我们可以大方地估计每个数据的大小为1kb,相当于在叶子节点中每个节点可以存储16个数据。

这样就可以计算出一个三层的B+树结构的索引一共可以存储1170117016=2190万条数据,这就意味着只需要三次磁盘IO,就可以检索两千万条数据,由此可见索引可以支撑千万级表的快速查找。

(四)Innodb索引的实现

Mysql中的存储引擎有Innodb和Myisam两种,两种索引的实现底层虽然都是B+树,但是实现形式还是略有不同。

Innodb属于聚簇索引,即叶子节点包含了完整的数据记录。下面这张图是innodb的主键索引,所有的数据都放在叶子节点中。

Innodb要求表必须有主键,并且推荐使用整型的自增主键,这也和他索引的实现有关,使用整型可以更好的进行B+树的排序,同时采用自增的方式可以在插入数据时将数据插入到最后一个节点的后一个,而不用对已产生的索引拆分。

非主键索引和主键索引略有不通,非主键索引的叶子节点存储的是主键的key值:

采用这种方式保持了数据的一致性,当新增一条数据时,只需要在主键索引处修改数据即可,而不会出现每个索引各自维护的情况。第二个优势是节省了存储的空间,数据只需要保存一份即可。

(五)MyIsam索引的实现

Myisam索引文件和数据文件是分离的,在MyIsam存储引擎中,新建一张表后会在磁盘中增加三个文件:

.frm 文件存储的是表结构,.MYI文件存储的是B+树的索引表,MYD存储的是数据,我通过下面这张表展示MyIsam索引:

(六)总结

关于数据库的索引,绝对是工作中常用,面试常考的问题,他太重要了。理解索引底层数据结构更加重要,这是后续优化的基础,好了,我们下期再见!

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,官方群点击此处进入。

mysql 栅格数据结构_图解Mysql索引的数据结构!看不懂你来找我相关推荐

  1. mysql索引背后的数据结构_图解Mysql索引的数据结构!看不懂你来找我

    听说微信搜索<Java鱼仔>会变更强哦! 本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)关于索引 索引是帮助Mysql更加高效获取数据的 ...

  2. 整型索引查询mysql是不是快点_图解Mysql索引的数据结构!看不懂你来找我

    听说微信搜索<Java鱼仔>会变更强哦! 本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 (一)关于索引 索引是帮助Mysql更加高效获取数据的 ...

  3. mysql手机客户端_图解MySQL索引--B-Tree(B+Tree)

    看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引....或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等 ...

  4. mysql 写磁盘_图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅

    作者及简介: 黄 炎,爱可生首席技术官: 王 悦,爱可生研发团队成员,负责数据库管理平台相关项目的开发和故障排查,好奇 MySQL 技术原理及各类数据库实现方案. 本文来源:转载自公众号-图解 MyS ...

  5. mysql新增字段位置_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  6. mysql+join+合计_图解MySQL里的各种 JOIN,看完不懂来找我!

    点击关注上方"SQL数据库开发", 设为"置顶或星标",第一时间送达干货作者:码志 链接:https://mazhuang.org/2017/09/11/joi ...

  7. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结

    MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...

  8. mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

    在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant Add Column 的方案 ...

  9. mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...

    原创作者:图解MySQL 在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant A ...

最新文章

  1. C语言画圆(编译器:VS2013)
  2. 周志华:严肃的研究者就不该去触碰强人工智能
  3. 柯里化思想--JS中的预处理机制
  4. linux ftp服务
  5. java通过ip获取网卡MAC地址
  6. 领域驱动设计,让程序员心中有码(七)
  7. HttpClient的简单使用
  8. 为什么需要ORM 框架
  9. rxjs的一个例子:什么是rxjs的OperatorFunction?
  10. 文件包含——php伪协议(五)
  11. CBOW模型的学习、Trainer类的实现
  12. 支持专业设计师的高端样机素材网
  13. 交大计算机软件学院,上海交通大学软件学院
  14. java橙色风格小说精品屋小说网站源码
  15. OPENG 获取状态的一些枚举值
  16. 对讲机扫盲的基本常识
  17. 登陆163邮箱 验证邮箱帐号密码是否正确
  18. 资产负债及银行资产负债业务
  19. 所谓的牛逼,都是用苦逼换来的
  20. 微型计算机的 I3 I5是,i3和i5性能差多少?i3和i5处理器的区别 (全文)

热门文章

  1. 《深度强化学习实战》 第9章 多智能体
  2. Jurgen Appelo:职位名称三戒
  3. android settings 数据库,Android系统配置数据库注释(settings.db)
  4. 第二周测验 001:编程填空:学生信息处理程序
  5. mysql的功能是什么_数据库的作用是什么
  6. 梅西 vs 罗纳尔多:一场定义时代的竞争和世界杯荣耀的最后一枪
  7. 数据存储之大小端存储模式
  8. JavaSE练习题(上)
  9. 二进制、八进制、十进制与十六进制之间的转换(图片说明+举例介绍)
  10. ArcGIS API for JavaScript - 将图片设为map的底图