本文将渐进式的帮助理解mysql中innoDB的索引原理,InnoDB存储引擎是以页为单位进行存储的,一页的大小是16kb

1、InnoDB的行记录:

本次行记录的叙述主要以 COMPACT为主,其他的行记录都是相同的原理:

1.1 行记录的分类:

  • COMPACT:紧凑型行
  • REDUNDANT :字段长度偏移行
  • COMPRESSED :压缩行
  • DYNAMIC:动态行

查看当前的记录行格式:

show table status like 'table_name'

1.2 COMPACT的行格式:

2、InnoDB的页:

页是InnoDB存储引擎管理数据库的最小磁盘单位

InnoDB页结构如下图:

需要了解在文件头中存在两个属性分别是:FIL_PAGE_PREV(上页),FIL_PAGE_NEXT(下页)

具体的信息,此处略。

3、数据之间的联系:

在数据行中,有一个next_recod指向下一条元素的位置,所以在行数据之间就是类似于单向链表的结构,在页中行记录就是以链表的结构来存储的。

大概是下面这个样子:

新建一张表:

mysql> CREATE TABLE test(->     c1 INT,->     c2 INT,->     c3 VARCHAR(10000),->     PRIMARY KEY (c1)-> ) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.03 sec)
mysql>

插入几条数据:

mysql> INSERT INTO test VALUES(1, 100, 'aaaa'), (2, 200, 'bbbb'), (3, 300, 'cccc'), (4, 400, 'dddd');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql>

数据存储如下所示:

改图是简化了上面的图,其中的infimum代表页中的第一个元素,也就是最小的元素,sumpremum代表页中最后一个元素们,是页中最大的元素。

在查找时,由于主键时按照由小及大的方式存储的,所以查找时可以通过链表的形式,例如:

查找主键为3的元素:
根据元素找到主键为1的元素,依次往下找,因为链表的查询速率很高,所以很快就能找到。

一个页中只能存在16kb的数据,当数据量变大时,一个页也就不够存储相应的数据,假设一页只能存储两条数据,由第二部分得知,文件头存贮了上下页的位置信息,所以页之间的关系也就是相当于一个双向链表的形式:

这时候就会出现一个问题,查找的时候怎么才能知道我要去找那一页的数据呢

当然有相应的解决方案了,如下图所示:

这样就解决了查找的问题,例如:

查找主键是3的数据,从上面的数据得到了3所在页的地址,然后取那一页里面查找。

这时候,仔细一看,这不是树形结构吗,这就是B+树的结构。

4、索引:

上图就是一颗以主键为索引的B+树,在这颗树中,存储了所有列的信息,这类索引也叫做聚簇索引

来创建一个主键以外的索引:

ALTER TABLE test ADD INDEX index_c2(c2);

这是以c2 为索引,在InnoDB中,每建一个索引都会新增一个B+树,所以以c2为索引的B+树如下所示:

这时候会出现一个问题,因为在这个表里面没有c3的数据,这时候查询需要c3的数据,需要执行一个叫回表的操作。例如:

查找c2=200的数据,首先找到200数据所在的页,然后根据链表找到200数据,根据这条数据的主键,去之前的B+树里面查找整条数据。

这种索引叫做二次索引,添加union关键字的也被称作唯一索引

关于索引的基础原理就了解这么多,关于其他的索引是否命中,以后有空可以了解了解。

MySQL索引原理理解相关推荐

  1. mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》

    概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...

  2. 转:MySQL索引原理及慢查询优化

    来自:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色, ...

  3. (转)MySQL索引原理及慢查询优化

    转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...

  4. 干货:MySQL 索引原理及慢查询优化

    转载自 http://blog.csdn.net/kaka1121/article/details/51815368 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...

  5. MySQL索引原理及慢查询优化

    背景 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师 ...

  6. MySQL索引原理及慢查询优化,了解一下?

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库. 虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必 ...

  7. MySQL索引原理详解

    MySQL索引原理详解 索引的本质 索引的分类 Hash 索引 二叉树 B树(二三树) B+树 主键目录 索引页 索引页的分层 非主键索引 回表 索引的本质 索引的本质是一种排好序的数据结构. 索引的 ...

  8. (2)Mysql索引原理和优化总结

    Mysql设计原理栏目总结 (1)Mysql架构和常用引擎介绍 (2)Mysql索引原理和优化总结 1.索引理解和常见面试题 (1)本质 索引是一种能够高效获取数据的数据结构 索引存放在硬盘上 (2) ...

  9. mysql索引原理之聚簇索引

    索引分为聚簇索引和非聚簇索引. 以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻.这本书本身就是一个索引,即"聚簇索引". 如果要找& ...

最新文章

  1. 2021年春季学期-信号与系统-第十一次作业参考答案-第二小题
  2. java动态交叉表,SqlServer如何生成动态交叉表查询
  3. Raft成员变更的工程实践
  4. python-opencv使用摄像头
  5. 【报告分享】2020年小红书内容生态报告.pdf(附下载链接)
  6. Charles抓包工具过滤网络请求
  7. CentOS7搭建FTP文件服务器
  8. 2022年湖北省中小企业公共服务平台认定指南(各地配套奖补政策及申报条件)
  9. 前端面试题及答案(字节跳动)(一)
  10. excel两列数据对比找不同_快速找出Excel表格中两列数据不同内容的3种方法!
  11. 网页代码优化html标签,通过优化网页HTML代码提高网页访问速度
  12. linux统计代码耗时函数,统计函数执行耗时
  13. 设计模式学习笔记--访问者(Visitor)模式
  14. OWT Server信令分析 (下) [Open WebRTC Toolkit]
  15. Linux shell脚本
  16. Unity限制旋转角度
  17. 使用pytorch搭建自己的网络之Res2Net
  18. 06_04_任务二:SSM拉勾教育后台管理系统(广告模块与用户模块)
  19. VvvebJs —— 使用拖拽的方式生成网页
  20. 如何用java开发一个网站?

热门文章

  1. 移动目标定位技术笔记1:WiFi、ZigBee、UWB技术
  2. 29 架构师领导艺术
  3. vs编译运行报错:未声明的标识符
  4. arch使用create_ap创建wifi热点
  5. 单链表的头插法与尾插法
  6. 屏幕录制和视频剪辑Filmage Screen
  7. GetCurrentTime函数
  8. 【PHP】PHP开发环境搭建——windows篇(apache2.2.22+php5.3.29+mysql5.7)
  9. XDOJ 综合题 数字分解排序
  10. NPOI写Excel,Microsoft.Office.Interop.excel.dll 转换Excel为PDF