一文让你对mysql索引底层实现明明白白

京东云开发者
• 阅读 12

作者:京东零售 韩航云

开篇:

图片是本人随笔画的,有点粗糙,望大家谅解,如有不对的地方,请联系本人,感谢

一、索引到底底是什么

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

.索引是存储在文件里的

.数据结构: 二叉树 HASH BTREE

一文让你对mysql索引底层实现明明白白

如果没有索引的话,循环一条一条的找,找一次就是一次IO,这样速度就会很慢

我们知道数据库数据都是存在磁盘上的,当我们查找数据时,就会从磁盘上取数据,每取一次就是一次IO,IO是非常耗时的,为了速度快会把数据放到缓存里,然后在缓存里进行操作



二、磁盘存取原理

一文让你对mysql索引底层实现明明白白

当查找数据的时候,就是磁头循环找此道,就会一直循环查找,一次查找就是一次IO,IO是很耗时的

三、Mysql数据结构详解

就拿上面的7条数据来说,如果没有索引,当我们查找第7条数据时,就会循环7次,如果有百万级别的数据,那么就会查找百万次,显然这样是不行的,就需要数据结构算法来优化,那我们就从二叉树----HASH---BTREE来一一说起

3.1、二叉树

二叉树节点保存的都是单个索引,高度会随着数据增大而增高,但是比一条一条的循环会快

一文让你对mysql索引底层实现明明白白

一文让你对mysql索引底层实现明明白白

不用二叉树是因为的极端情况下会出现单边增长,这样在数量大的情况下,和一条一条查找没有区别。

3.2、红黑树

红黑树有自平衡性质,不会出现单边增长,它会动态自旋转,在性能上比二叉树又高一点,但是mysql也没有用这种数据结构,因为数据量超大的情况下,数据高度也会一直增大,在最终这个树高度也非常大,解决不了根本问题



一文让你对mysql索引底层实现明明白白

3.3、HASH

hash算法一次就会定位到文件指针,速度快,但是还是没有用,如果范围查找的话就没有办法了,如果只是内存中的话,他的时间复杂度是O(1),速度会会很快,但是索引文件也是保存在磁盘上,而且hash是不连续的放在磁盘上的,这样查询起来也很慢,这才是不用hash的最根本原因



一文让你对mysql索引底层实现明明白白



3.4、B-TREE

相比上面的数据结构,b-tree增加了横向大小(度Degree),那么在高度上就减小了,查找次数就少了

 一文让你对mysql索引底层实现明明白白

15,56,77.。。。。是索引,data就是对应的一行数据

那么在横向的度上最大多少合适呢??总不能横向上一直扩展下呀,磁盘一次IO,就是取一个横向的节点(度),把一个节点的数据放在缓存中,那么一次IO也不能把所用的数据全取出来,所以最好是一次io,就把这个节点全取处理,电脑操作系统从磁盘一次取数据到内存中一般是4K,而mysql取一次数据一般是16K,所以横向节点一般设置为16K。 因为一个节点设置成16K的话,这个节点保存了索引和索引对应行的数据,那么这个节点横向保存不了太多的数据,所以,这种数据结构也不合适,引入新的数据结构



一文让你对mysql索引底层实现明明白白



3.5、B+Tree

查找一次数据就是和磁盘一次IO,一次IO会把这个数据相邻的数据一下全部查处理,这样速度会更快,这样的一页就是咱们说的一个节点(4K),分配空间的时候也是一页一页分配的,这样会更快,一页就是一个节点



一文让你对mysql索引底层实现明明白白







mysql 常用的引擎有MyISAM和InNoDB,两种引擎得索引结构是不一样的,如下:

MyISAM的数据结构:

.frm表结构文件 .myd表数据文件 .myi表索引文件



一文让你对mysql索引底层实现明明白白

一文让你对mysql索引底层实现明明白白

myisam引擎的主键索引数据结构是左上图,普通索引是右上图,叶子节点存的不是数据本身,是数据文件指针,和b_tree数据不一样,注意:每类的索引,都是各自的树,不是混合在一起的

.frm表结构文件 .ibd 表数据和索引文件



一文让你对mysql索引底层实现明明白白



InnoDB索引实现(聚集):

•数据文件本身就是索引文件

•表数据文件本身就是按B+Tree组织的一个索引结构文件

•聚集索线引一叶节点包含了完整的数据记录----(主键)

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

•为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)



一文让你对mysql索引底层实现明明白白

主键索引是聚集索引,因为叶子节点是所有的数据,就是一行数据,非主键索引叶子节点只包括索引和主键,再用主键找对应数据

非主键索引叶子节点只包括索引和主键,再用主键找对应数据,这样是为了节省空间和数据一致性



联合索引:

要满足最左原则

联合索引(col1, col2, col3)也是一棵B+树,其非叶子节点存储的是第一个关键字的索引,而叶子节点存储的则是三个关键字col1、col2、col3三个关键字的数据,且按照col1-col2-col3的顺序进行排序。



一文让你对mysql索引底层实现明明白白



例如:

如果执行: SELECT * FROM T WHERE B=‘赵六’ AND C=123;

那么无法使用索引,因为索引是用A字段先排序的,如果没有先确定A,直接查找B和C,那么将会是全表查询



如果执行: SELECT * FROM T WHERE A=‘30’ ;

那么,会先找到A字段,再在A等于30的数据中(比如有很多条),找B等于DE的数据。这样是可以用到索引的



如果执行: SELECT * FROM T WHERE A=‘18’ AND C=345;

那么,A字段可以索引,而C不能索引。所以可以部分索引,也比全表查询快



如果执行 : SELECT * FROM T WHERE B=DE AND C=1234 and A=‘2’

是用到索引的,在and的情况下如果把第一个放到最后位置也是能用到索引的



现在我想大家应该了解了什么为什么是最左原则。因为,B+树是按照最左边的字段以此构建的。

点赞
收藏
评论区
推荐文章
MySql索引下推知识分享
作者:刘邓忠Mysql是大家最常用的数据库,下面为大家带来mysql索引下推知识点的分享,以便巩固mysql基础知识,如有错误,还请各位大佬们指正。1什么是索引下推索引下推(IndexConditionPushdown,索引条件下推,简称ICP),是MyS
Wesley13 Wesley13
3年前
SQL优化看这一篇就够了
MySQL索引1\.定义索引是帮助MySQL高效获取数据的数据结构。索引内部存在一个键值和对应数据的物理地址,当数据很多的时候,索引文件会很大,所以一般以文件的形式存储于磁盘中,后缀名为.myi。2\.常用索引类型聚集索引次要索引覆盖索引
Peter20 Peter20
3年前
什么是索引?Mysql目前主要的几种索引类型
一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创
Wesley13 Wesley13
3年前
mysql(索引)
MySQL索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的
Wesley13 Wesley13
3年前
mysql面试题
MySQL面试索引相关1.什么是索引?索引是一种数据结构,可以帮助我们快速的进行数据的查找.1.索引是个什么样的数据结构呢?索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B树索引.
Wesley13 Wesley13
3年前
MYSQL 索引类型
  在MYSQL中,索引是在引擎层中而不是服务器层实现的。所以并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同(1)BTree索引    如果没有特别指明类型的话,那么就代指为BTree引擎,它使用BTree数据结构来
Wesley13 Wesley13
3年前
Mysql索引底层数据结构与算法
索引是什么索引是帮助MySQL高效获取数据的排好序的数据结构。索引存储在文件里补充知识:磁盘存取原理:寻道时间(速度慢,费时)旋转时间(速度较快)磁盘IO读取效率:单次IO读取是N个页的大小,读取数据量大于N个页就需要分页读取。索
Stella981 Stella981
3年前
ELK学习笔记之ElasticSearch的索引详解
0x00ElasticSearch的索引和MySQL的索引方式对比Elasticsearch是通过Lucene的倒排索引技术实现比关系型数据库更快的过滤。特别是它对多条件的过滤支持非常好,比如年龄在18和30之间,性别为女性这样的组合查询。倒排索引很多地方都有介绍,但是其比关系型
Stella981 Stella981
3年前
B+Tree索引为什么可以支持千万级别数据量的查找——讲讲mysql索引的底层数据结构
MySQL索引底层数据结构索引是存储引擎快速找到记录的一种数据结构一、有索引与没索引的差距先来看一张图:!(https://static.oschina.net/uploads/img/202010/14150116_INlJ.png)左边是没有索引的情况,右边是作为
一文让你对mysql索引底层实现明明白白
开篇:图片是本人随笔画的,有点粗糙,望大家谅解,如有不妥之处,请联系我们,感谢。一、索引到底底是什么.索引是帮助mysql高效获取数据的排好序的数据结构.索引是存储在文件里的.数据结构:二叉树HASHBTREE如果没有索引的话,循环一条一条的找,找一次就是