广告
返回顶部
首页 > 资讯 > 数据库 >mysql的索引底层之实现原理是什么
  • 806
分享到

mysql的索引底层之实现原理是什么

2024-04-02 19:04:59 806人浏览 薄情痞子
摘要

这篇文章主要介绍了Mysql的索引底层之实现原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql索引背后的数据结构及算法原理一、定

这篇文章主要介绍了Mysql索引底层之实现原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

mysql索引背后的数据结构算法原理

一、定义

索引定义:索引(Index)是帮助Mysql高效获取数据的数据结构。
本质:索引是数据结构。

二、B-Tree

m阶B-Tree满足以下条件:
1、每个节点至多可以拥有m棵子树。
2、根节点,只有至少有2个节点(要么极端情况,就是一棵树就一个根节点,单细胞生物,即是根,也是叶,也是树)。
3、非根非叶的节点至少有的Ceil(m/2)个子树(Ceil表示向上取整,如5阶B树,每个节点至少有3个子树,也就是至少有3个叉)。
4、非叶节点中的信息包括[n,A0,K1,A1,K2,A2,…,Kn,An],,其中n表示该节点中保存的关键字个数,K为关键字且Ki<Ki+1,A为指向子树根节点的指针。
5、从根到叶子的每一条路径都有相同的长度(叶子节点在相同的层)

B-Tree特性:

mysql的索引底层之实现原理是什么

1、关键字集合分布在整颗树中;
2、任何一个关键字出现且只出现在一个节点中;
3、每个节点存储date和key;
4、搜索有可能在非叶子节点结束;
5、一个节点中的key从左到右非递减排列;
6、所有叶节点具有相同的深度,等于树高h。

B-Tree上查找算法的伪代码如下:
mysql的索引底层之实现原理是什么

三、B+Tree

mysql的索引底层之实现原理是什么

B+Tree与B-Tree的差异在于:
1、B+Tree非叶子节点不存储data,只存储key;
2、所有的关键字全部存储在叶子节点上;
3、每个叶子节点含有一个指向相邻叶子节点的指针,带顺序访问指针的B+树提高了区间查找能力;
4、非叶子节点可以看成索引部分,节点中仅含有其子树(根节点)中的最大(或最小)关键字;

四、B/B+树索引的性能分析

依据:使用磁盘I/O次数评价索引结构的优劣
主存和磁盘以页为单位交换数据,将一个节点的大小设为等于一个页,因此每个节点只需一次I/O就可以完全载入。
根据B树的定义,可知检索一次最多需要访问h个节点
渐进复杂度:O(h)=O(logdN)
dmax=floor(pagesize/(keysize+datasize+pointsize))
一般实际应用中,出度d是非常大的数字,通常超过100,因此h非常小(通常不超过3,3层可存大约一百万数据)
B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存)
B+Tree内节点不含data域,因此出度d更大,则h更小,I/O次数少,效率更高,故B+Tree更适合外存索引。

五、MySQL索引实现
1、MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址;
    MyISAM主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复;

2、InnoDB的数据文件本身就是索引文件,叶节点包含了完整的数据记录,这种索引叫做聚集索引。
因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。
    InnoDB的辅助索引data域存储相应记录主键的值而不是地址;
    辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录;

3、页分裂问题

mysql的索引底层之实现原理是什么

如果主键是单调递增的,每条新记录会顺序插入到页,当页被插满后,继续插入到新的页;

如果写入是乱序的,InnoDB不得不频繁地做页分裂操作,以便为新的行分配空间。页分裂会导致移动大量数据,一次插入最少需要修改三个页而不是一个页。

如果频繁的页分裂,页会变得稀疏并被不规则地填充,所以最终数据会有碎片。

六、总结

了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助

1、为什么不建议使用过长的字段作为主键?

2、为什么选择自增字段作为主键?

3、为什么常更新是字段不建议建立索引?

4、为什么选择区分度高的列作为索引?区分度的公式是count(distinct col)/count(*)

5、尽可能的使用覆盖索引

七、优化LIMIT分页查询

SELECT * FROM table  where condition LIMIT offset , rows ;

上述SQL语句的实现机制是:
 1、从“table”表中读取offset+rows行记录。
 2、 抛弃前面的offset行记录,返回后面的rows行记录作为最终的结果。
覆盖索引:

select  a.id, sid, parent_s_id from cashpool_account_relationship a join (select id from cashpool_account_relationship LIMIT 1000000,10)b on a.id = b.id;
select  id, sid, parent_s_id from cashpool_account_relationship where id >=(select id from cashpool_account_relationship LIMIT 1000000,1) LIMIT 10;

八、Q&A

1、InnoDB支持hash索引吗?--马欣
InnoDB是支持hash索引的,不过其支持的hash索引是自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成hash索引,不能人为干预是否在一张表中生成hash索引。
2、InnoDB主键索引的叶节点含完整的数据记录,那主键索引文件要比数据文件大吗?--徐财厚
1).在Innodb 引擎中,主键索引中的叶子结点包含记录数据,主键索引文件即为数据文件。
2).在 tables 表中统计的data_length数据为主键索引大小,index_length 为统计的这个表中所有辅助索引(二级索引)索引的大小。
mysql的索引底层之实现原理是什么

感谢你能够认真阅读完这篇文章,希望小编分享mysql的索引底层之实现原理是什么内容对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,遇到问题就找编程网,详细的解决方法等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: mysql的索引底层之实现原理是什么

本文链接: https://www.lsjlt.com/news/52911.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql的索引底层之实现原理是什么
    这篇文章主要介绍了mysql的索引底层之实现原理是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。MySQL索引背后的数据结构及算法原理一、定...
    99+
    2022-10-18
  • MySQL索引的底层实现原理是什么
    这篇文章主要介绍MySQL索引的底层实现原理是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL索引的底层实现原理1、Hash索引2、BTree索引和B+Tree索引3、全...
    99+
    2022-10-18
  • MySQL中索引的底层实现原理是什么
    本篇文章为大家展示了MySQL中索引的底层实现原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  MySQL索引底层实现原理  MySQL官方对索引的定义为...
    99+
    2022-10-18
  • MySQL索引的底层原理是什么
    这篇文章将为大家详细讲解有关MySQL索引的底层原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。索引类型从索引的实现上,我们可以将其分为聚集索引与非...
    99+
    2022-10-18
  • 索引失效底层原理是什么
    这篇文章主要讲解了“索引失效底层原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“索引失效底层原理是什么”吧!单值索引B+树图单值索引在B+树的结构里...
    99+
    2022-10-18
  • mysql数据库中索引的底层原理是什么
    本篇文章为大家展示了mysql数据库中索引的底层原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面,我们举例来说明一下聚集索引和非聚集索引的区别:其实,我...
    99+
    2022-10-18
  • MySQL索引的底层原理怎么理解
    这篇文章主要介绍了MySQL索引的底层原理怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL索引的底层原理怎么理解文章都会有所收获,下面我们一起来看看吧。Mysql 作为互联网中非常热门的数据库,...
    99+
    2023-07-04
  • PHP与MySQL索引的原理和底层实现细节
    MySQL是一种非常流行的关系型数据库管理系统,而PHP是一种广泛用于开发Web应用程序的服务器端脚本语言。在开发Web应用程序时,经常需要与数据库进行交互,而索引是提高数据库查询性能的重要机制之一。本文将介绍PHP与MySQL索引的原理和...
    99+
    2023-10-21
    PHP MySQL索引 底层实现细节
  • MySQL 8 新特性之降序索引底层实现
    我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引。 但是大家不知道的是,上面这个sql实际上和下...
    99+
    2018-04-18
    MySQL 8 新特性之降序索引底层实现
  • 数据库中的索引和锁底层原理是什么
    数据库中的索引和锁底层原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 一、索引在之前,我对索引有以下的认知...
    99+
    2022-10-19
  • MySQL索引底层数据结构是什么
    本篇文章为大家展示了MySQL索引底层数据结构是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  案例:  CREATE TABLE `employees` (...
    99+
    2022-10-18
  • chatgpt底层实现的原理是什么
    chatgpt底层实现的原理是通过人工的标注方式来训练出一种强化学习的冷启动模型和reward反馈模型,然后再通过强化学习的模式来学...
    99+
    2023-02-09
    chatgpt
  • Synchronized的底层实现原理是什么
    Synchronized的底层实现原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)给静态方法加锁public&n...
    99+
    2022-10-19
  • HashMap的底层实现原理是什么
    这篇文章给大家介绍HashMap的底层实现原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.HashMap的常用方法//  Hashmap存值:----------------------...
    99+
    2023-06-06
  • MySQL索引的实现原理是什么
    MySQL的索引实现原理主要基于B+树结构。B+树是一种多路平衡查找树,它的每个节点可以存储多个键值对,并且所有叶子节点通过指针连接...
    99+
    2023-08-15
    MySQL
  • Mysql索引底层及优化方法是什么
    今天小编给大家分享一下Mysql索引底层及优化方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2022-10-19
  • golang map底层实现原理是什么
    Golang中的map是基于散列表(hash table)实现的。散列表是一种用于存储键值对的数据结构,它通过将键映射到数组的索引来...
    99+
    2023-10-21
    golang
  • 浅谈mysql join底层原理是什么
    本篇内容主要讲解“浅谈mysql join底层原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“浅谈mysql join底层原理是什么”吧!目录join算法驱动表和非驱动表的区别Simpl...
    99+
    2023-06-20
  • mysql数据库底层原理是什么
    这篇“mysql数据库底层原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
    99+
    2023-04-22
    mysql
  • HashMap之keyset()方法的底层原理是什么
    这篇文章主要讲解了“HashMap之keyset()方法的底层原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“HashMap之keyset()方法的底层原理是什么”吧!HashMap...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作