引言

索引是帮助MySQL高效获取数据的排好序的数据结构

索引数据结构对比

二叉树

左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据。如果col2是索引,查找索引为89的行元素,那么只需要查找两次,就可以获取到行元素所在的磁盘指针地址。

如果col1是索引,查找索引为6的行元素,那么需要查找六次,就可以获取到行元素所在的磁盘指针地址,即得到了该索引为6的行元素。因此二叉树不适合存储单边增长的序列字段,近乎全表扫描获取数据。

红黑树

本质二叉树,属于二叉平衡树,jdk1.8 hashmap的底层实现;存储大数据量,树的高度不可控, 数量越大,树的高度越高;500w行数据,2的n次方=500w数据量, n是树的高度,也就是查询次数;

hash表

通过散列可以快速获取磁盘文件指针,对于指定索引查找文件非常快,但是对于范围查找没法支持。

B树

本质是多路二叉树;叶节点具有相同的深度,叶节点的指针为空;所有索引元素不重复;节点中数据索引从左到右依次递增的;

B+树(B树的变种)

非叶子节点不存储数据,只存储索引(冗余)和指针,可以放更多的索引,树高降低 ;叶子节点包含所有索引字段;叶子节点比b树增加了指针连接;叶子节点有双向指针链接(首尾子节点还通过指针连接),提高区间访问的性能,范围查找;

为什么mysql页文件默认16K?

MySQL每个B+树节点最大存储容量:16KB (指针+数据+索引)。假设我们一行数据大小为1K,那么一页就能存16条数据,也就是一个叶子节点能存16条数据;再看非叶子节点,假设主键ID为bigint类型,那么长度为8B,指针大小在Innodb源码中为6B,一共就是14B,那么一页里就可以存储16K/14=1170个(主键+指针)那么一颗高度为2的B+树能存储的数据为:117016=18720条,一颗高度为3的B+树能存储的数据为:11701170*16=21902400(千万级条)

show global status like `Innodb_page_size`复制代码

因此,B+树存储大数据量的表也可以非常高效的获取数据,MySQL使用B+树作为索引的数据结构。

存储引擎

存储引擎最终作用于:表 ,不是数据库在mysql的安装的根目录下,有一个data目录,里面存放的是所有表的数据。

  • MyISAM:
  • MyISAM索引文件和数据文件是分离的(非聚集或稀疏);
  • 主键索引和辅助主键索引存储类似;

frm文件:存储这张表的表结构MYD文件:存储这张表的所有数据行MYI文件:存储这张表的索引字段

  • InnoDB(聚集):

表数据文件本身是按照B+tree组织的一个索引结构文件frm文件:存储这张表的表结构ibd文件:存储这张表的所有数据行和索引字段聚集(聚簇)索引----叶节点包含完整数据记录

为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?

  • 首先,为了满足MySQL的索引数据结构B+树的特性,必须要有索引作为主键,可以有效提高查询效率,因此InnoDB必须要有主键。如果不手动指定主键,InnoDB会从插入的数据中找出不重复的一列作为主键索引,如果没找到不重复的一列,InnoDB会在后台增加一列rowId做为主键索引。
  • 其次,索引的数据类型是整型,一方面整型占有的磁盘空间或内存空间相比字符串更少,另一方面整型比较比字符串比较更快速,字符串比较是先转换为ASCII码,然后再比较的。
  • 最后,B+树本质是多路多叉树,如果主键索引不是自增的,那么后续插入的索引就会引起B+树的其他节点的分裂和重新平衡,影响数据插入的效率,如果是自增主键,只用在尾节点做增加就可以。

为什么非主键索引结构叶子节点存储的是主键值?

  • 主键索引和非主键索引维护各自的B+树结构,当插入的数据的时候,由于数据只有一份,通过非主键索引获取到主键值,然后再去主键索引的B+树数据结构中找到对应的行数据,节省了内存空间;
  • 如果非主键索引的叶子节点也存储一份数据,如果通过非主键索引插入数据,那么要向主键索引对应的行数据进行同步,那么会带来数据一致性问题。可以通过事务的方式解决,我们都知道使用事务后,就会对性能有所消耗。

联合索引

  • 联合索引的底层存储结构长什么样?

定义联合索引(员工级别,员工姓名,员工出生年月),将联合索引按照索引顺序放入节点中,新插入节点时,先按照联合索引中的员工级别比较,如果相同会按照是员工姓名比较,如果员工级别和员工姓名都相同 最后是员工的出生年月比较。可以从图中从上到下,从左到右看,第一个B+树的节点 是通过联合索引的员工级别比较的,第二个节点是 员工级别相同,会按照员工姓名比较,第三个节点是 员工级别和员工姓名都相同,会按照员工出生年月比较。

小结

欢迎关注头条号:JAVA大飞哥

点击关注评论转发一波:私信小编发送“架构”(免费获取)

获取微服务、分布式、高并发、高可用,性能优化丶Mysql源码分析等等一些技术资料

最后,每一位读到这里的Java程序猿朋友们,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序猿的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

点击关注不迷路

mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事相关推荐

  1. mysql联合主键_初探SQL语句复合主键与联合主键

    一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id nu ...

  2. mysql 联合主键_Mysql 创建联合主键

    Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb ...

  3. mysql 联合主键重复数据库_联合主键和复合主键有什么区别

    联合主键和复合主键有什么区别 发布时间:2020-07-11 09:52:20 来源:亿速云 阅读:171 作者:Leah 这期内容当中小编将会给大家带来有关联合主键和复合主键有什么区别,文章内容丰富 ...

  4. mysql联合主键是不是索引_MySQL:联合主键、索引

    MySQL数据库用联合主键.用两张表测试. # 1分钟数据表 CREATE TABLE md_1min2( `d_1min` DATETIME(3), `code` CHAR(16), `open` ...

  5. mysql联合主键语句6_初探SQL语句复合主键与联合主键

    一.复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键. 比如 create table test ( name varchar(19), id nu ...

  6. sql 复合主键 联合主键_学习SQL:主键

    sql 复合主键 联合主键 If you've already worked with databases, then you could hardly miss the term – Primary ...

  7. 深入理解硬盘原理,Mysql索引底层数据结构与算法的来龙去脉(多图)

    前言: 如何触发尽量少的磁盘io 找到数据? 数据库中的索引是什么? 硬盘原理 现在大部分存储设备依然是硬盘 信息存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大, ...

  8. mysql联合主键和单一主键

    索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引.组合索引,即一个索包含多个列. MySQL索引类型包括:   (1)普通索引 这是最基本的索引, ...

  9. mysql 联合主键 加锁_MySQL 加锁处理分析

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

最新文章

  1. VC++中线程同步技术分析3
  2. java类编译_java类编译过程
  3. matlab cfun,【图片】求求各位大佬帮弱鸡看看【matlab吧】_百度贴吧
  4. jQuery easyUI--accordion折叠面板
  5. mplayer 所支持的音视频编解码
  6. docker下mongodb备份导入数据库
  7. Linux下ps命令详解
  8. STM32基础定时器详解
  9. Linux运维之--zabbix使用(实时更新)
  10. unity多人联机插件_Unity网络系统插件,打通游戏联网任督二脉
  11. 软件系统分析-分账系统
  12. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第十章 20世纪的科学技术变革
  13. windows7 优化:readyboost总结
  14. python解决中文显示问题Glyph 24179 (\N{CJK UNIFIED IDEOGRAPH-5E73}) missing from current font. func(*args)
  15. 设置gmail邮箱代收的方法
  16. 还在用 Guava Cache?它才是 Java 本地缓存之王!
  17. 三菱M80操作介绍_三菱PLC操作
  18. 高并发场景下秒杀系统的设计思路
  19. iOS 3DES加密
  20. 手把手教你使用wordPress+阿里云虚拟主机搭建个人博客

热门文章

  1. ASP.NET -- WebForm -- Cookie的使用 应用程序权限设计 权限设计文章汇总 asp.net后台管理系统-登陆模块-是否自动登陆 C# 读写文件摘要...
  2. java基础加强_补充笔记
  3. 地址url的split()方法使用;
  4. 基础才是重中之重~通过人类的生活来学习Delegate
  5. Linux/unix不同shell环境下数值运算的处理
  6. 使用反射建立一个用于生产短信对象的工厂方法
  7. sql server中扩展存储过程
  8. Jstatd命令(Java Statistics Monitoring Daemon)
  9. JavaMail发送邮件的笔记及Demo
  10. 诚通网盘会员很坑的,升级会员的人要注意