Mysql底层索引详解

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

索引本质以及索引类型:
在这里插入图片描述
MySQL底层索引的数据结构是B+Tree(B-Tree变种)

  1. 非叶子节点不存储data,只存储索引,可以放更多的索引;
  2. 顺序访问指针,提高区间访问的性能。
    在这里插入图片描述
    B+Tree树节点的大小为16KB,每个树的的结点会被load到内存,每次和磁盘进行一次IO操作(比较耗时)。
  3. 一个索引的内存大小为8B,指针的内存大小为6B,所以一个索引的实际大小为14B(字节)。
  4. 16KB / 14B 约等于1170,所以一个B+Tree树节点可以存放1170个索引。那么第二层的索引个数大约为1170 * 1170个。
  5. 毛估第三层一个索引+对应的数据的大小为1KB,那么第三层一个叶子节点可以包含16KB / 1KB = 16个索引。那么这样下来**B+Tree的三层可以存放1170 x 1170 x 16 = 2千多万个索引。**
    在这里插入图片描述

1,为什么不使用Hash作为索引方法?
答:不支撑范围查询。select * from student where id > 10;
B+Tree可以支撑范围查找,因为他有一个指针指向下一个索引。如图:
在这里插入图片描述

数据库的表结构,数据,索引的存放位置:

在这里插入图片描述
MySQL表的存储引擎为MyISAM:

  1. frm文件存放表结构;
  2. MYD文件存放表中的数据;
  3. MYI文件存放表的索引。
    在这里插入图片描述
    在这里插入图片描述
    MyISAM存储引擎的查找过程:
    1,将B+Tree的索引节点load到内存,进行比较,依次往树的下面寻找;
    2,最后在树的叶子节点找到与之对应的索引值,而索引的data存放的是:索引所在数据行的磁盘文件指针(如上图:Ox90);
    3,根据该指针,把数据从数据表中查询出来即可。
    该过程查找了2个文件,一个MYI文件,一个MYD文件;相比InnoDB多了一个磁盘IO。

MySQL表的存储引擎为InnoDB:

1,frm文件存放表结构;
2,ibd文件存放索引和数据。
在这里插入图片描述
InnoDB存储引擎的查找过程:
1,将B+Tree的索引节点load到内存,进行比较,依次往树的下面寻找;
2,最后在树的叶子节点找到与之对应的索引值,而索引的data存放的是:索引对应行的数据;
该过程只查找了1个文件,ibd文件,相比MyISAM存储引擎少了一次磁盘IO。
在这里插入图片描述

1,什么是聚集索引?

  • 聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个。

  • 聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。

  • InnoDB的主键索引就是聚集索引,叶子节点包含了完整的数据记录,数据和索引存储在同一个文件;MyISAM的主键索引就是非聚集索引,索引存储在MYI文件,数据存储在MYD文件。

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

  • 如果InnoDB表没有设置主键,后台会自动生成一个主键,所以必须自己建,没必要MySQL帮我们再加一个字段,占用内存;
  • 如果使用UUID作为主键,在进行比较时(abc3f,abcdf 转成ASCII码进行比较) 没有整型数据大小比较快;
  • 如果不是自增,假如叶子节点达到16个满了,再生成一个索引时,恰好索引值大小处于该叶子节点的中间,导致叶子节点要拆分,增加了B+Tree的层级,减慢了索引查找的性能。如下图:
    在这里插入图片描述

Innodb的非主键索引(负索引)查找逻辑:

先根据name找到ID,然后根据ID找到对应的数据
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

b树和b+树的区别:b树和b+树的区别聚集索引和非聚集索引的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的全文索引底层原理是基于倒排索引的。在MySQL中,全文索引只支持英文,如果需要对中文进行全文检索,可以使用sphinx的中文版(coreseek)。 底层原理包括MySQL缓冲池、索引底层原理、页分裂与页合并、B树的优势以及索引操作等。 MySQL缓冲池是用于管理数据页的,包括数据页与数据页管理、free链表、flush链表、哈希表以及LRU链表。 索引底层原理分为InnoDB索引和MyISAM索引。InnoDB索引包括行记录与页内索引、页外索引页、B树结构、聚簇索引以及InnoDB索引文件。而MyISAM索引包括聚簇索引VS非聚簇索引以及MyISAM索引文件。 页分裂与页合并是指当索引的数据页满了之后,需要进行分裂操作,将数据分散到新的数据页中,或者当数据删除时,页空间过多时需要进行合并操作,将数据整理到更少的页中。 B树是一种常用的索引数据结构,相比于其他数据结构如AVL树、红黑树、哈希表和跳表,B树具有较好的平衡性和高效的插入、删除和查找性能,因此被广泛应用于索引中。 索引操作包括创建索引、删除索引、查看索引、全文索引和复合索引最左匹配原则等。创建索引默认主键,删除索引是指删除已经创建的索引,查看索引可以使用EXPLAIN语句来查看索引的使用情况。全文索引用于对文本内容进行全文检索,而复合索引最左匹配原则是指在复合索引中,只有最左边的列被使用时索引才会生效。 综上所述,MySQL的全文索引底层原理是基于倒排索引的,具体包括MySQL缓冲池、索引底层原理、页分裂与页合并、B树的优势以及索引操作等方面的内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MYSQL索引底层原理](https://blog.csdn.net/winy1986/article/details/125758304)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [详解MySQL索引底层原理](https://blog.csdn.net/Wyf_Fj/article/details/126415270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值