MySQL索引原理理解
本文将渐进式的帮助理解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索引原理理解相关推荐
- mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》
概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...
- 转:MySQL索引原理及慢查询优化
来自:http://tech.meituan.com/mysql-index.html MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色, ...
- (转)MySQL索引原理及慢查询优化
转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...
- 干货:MySQL 索引原理及慢查询优化
转载自 http://blog.csdn.net/kaka1121/article/details/51815368 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首 ...
- MySQL索引原理及慢查询优化
背景 MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师 ...
- MySQL索引原理及慢查询优化,了解一下?
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库. 虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必 ...
- MySQL索引原理详解
MySQL索引原理详解 索引的本质 索引的分类 Hash 索引 二叉树 B树(二三树) B+树 主键目录 索引页 索引页的分层 非主键索引 回表 索引的本质 索引的本质是一种排好序的数据结构. 索引的 ...
- (2)Mysql索引原理和优化总结
Mysql设计原理栏目总结 (1)Mysql架构和常用引擎介绍 (2)Mysql索引原理和优化总结 1.索引理解和常见面试题 (1)本质 索引是一种能够高效获取数据的数据结构 索引存放在硬盘上 (2) ...
- mysql索引原理之聚簇索引
索引分为聚簇索引和非聚簇索引. 以一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻.这本书本身就是一个索引,即"聚簇索引". 如果要找& ...
最新文章
- 2021年春季学期-信号与系统-第十一次作业参考答案-第二小题
- java动态交叉表,SqlServer如何生成动态交叉表查询
- Raft成员变更的工程实践
- python-opencv使用摄像头
- 【报告分享】2020年小红书内容生态报告.pdf(附下载链接)
- Charles抓包工具过滤网络请求
- CentOS7搭建FTP文件服务器
- 2022年湖北省中小企业公共服务平台认定指南(各地配套奖补政策及申报条件)
- 前端面试题及答案(字节跳动)(一)
- excel两列数据对比找不同_快速找出Excel表格中两列数据不同内容的3种方法!
- 网页代码优化html标签,通过优化网页HTML代码提高网页访问速度
- linux统计代码耗时函数,统计函数执行耗时
- 设计模式学习笔记--访问者(Visitor)模式
- OWT Server信令分析 (下) [Open WebRTC Toolkit]
- Linux shell脚本
- Unity限制旋转角度
- 使用pytorch搭建自己的网络之Res2Net
- 06_04_任务二:SSM拉勾教育后台管理系统(广告模块与用户模块)
- VvvebJs —— 使用拖拽的方式生成网页
- 如何用java开发一个网站?
热门文章
- 移动目标定位技术笔记1:WiFi、ZigBee、UWB技术
- 29 架构师领导艺术
- vs编译运行报错:未声明的标识符
- arch使用create_ap创建wifi热点
- 单链表的头插法与尾插法
- 屏幕录制和视频剪辑Filmage Screen
- GetCurrentTime函数
- 【PHP】PHP开发环境搭建——windows篇(apache2.2.22+php5.3.29+mysql5.7)
- XDOJ 综合题 数字分解排序
- NPOI写Excel,Microsoft.Office.Interop.excel.dll 转换Excel为PDF