【Mysql】索引数据结构深入研究(二)

这篇具有很好参考价值的文章主要介绍了【Mysql】索引数据结构深入研究(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在这里需要明确的一点是,数据库的引擎InnoDB或者是MyISAM引擎它们是形容数据表的,不是形容数据库的。
另外:文章中提到的索引的数据结构暂且都默认使用B+Tree

InnoDB引擎

InnoDB的索引数据文件有两个,tableName.frm和tableName.ibd文件。

  • frm文件:表结构相关信息
  • ibd文件:所有数据(按照索引数据结构构建的)
    【Mysql】索引数据结构深入研究(二),Mysql,mysql,数据结构,数据库

在InnoDB表中,索引存储的是叶子节点上存储的是具体的数据。

MyISAM引擎

MyISAM的索引数据文件有三个,tableName.frm、tableName.MYD和tableName.MYI文件

  • frm文件:表结构的相关信息(字段啊什么信息)
  • MYD文件:数据存储(具体的数据)
  • MYI文件:索引存储(存放索引数据)
    【Mysql】索引数据结构深入研究(二),Mysql,mysql,数据结构,数据库
select * from table where table.Col1 = 30;

我们查询上述Col1为30的数据,会从MYI文件中索引数据结构中查找对于的数据,找到叶子节点之后MyISAM引擎的叶子节点不会存储具体的数据,而是存储对于数据所在的磁盘地址,然后在从MYD文件中找到具体的对应行数据。

在这里我们只了解两种引擎下的数据存储文件结构,了解了这两种索引文件存储结构之后我们继续往下

聚集索引(聚簇索引)

叶子节点包含了完整的数据记录,在InnoDB的主键索引就是一个聚集索引。

非聚集索引(非聚簇索引)

比如MyISAM引擎的主键索引就是一个非聚集索引,MYI索引文件中的叶子节点存储的数据对应着MYD文件中的具体数据。


这里有三个问题:
1.为什么建议InnoDB表建议建主键,并且推荐使用整型的自增主键?

  • 表数据文件(ibd)文件本身就是按照B+Tree组织的一个索引结构文件,如果我们不建主键,它会默认选择一列(所有数据不相等的数据),如果所有列都不符合的话它会帮我们建一个隐藏列,隐藏列会帮我们维护一个唯一ID,然后来组织整张表的索引数据,这样会造成不必要的开销。
  • 使用整型的主键是因为在进行索引查找的时候是从根节点进行查询然后进行大小比较整型的效率一定会大于非整形的比对效率,并且整型的磁盘空间占用要小于非整型
  • 使用自增主键会增加插入效率,如果使用非自增的主键,会导致索引的数据结构重新排列(B+Tree是排好序的数据结构)和树的平衡,自增主键只会往右开辟节点

2.聚集索引和非聚集索引查询效率如何?

从上面很容易看出来,聚集索引可以很直接的拿到数据,因此聚集索引效率要高

3.为什么非主键索引(二级索引,非聚集索引)结构叶子节点存储的是主键值(如图)

一致性和节省存储空间:节约空间应该比较好理解,一致性问题就是减少复杂增度,插入的时候只需要关注主键索引的数据就行。
【Mysql】索引数据结构深入研究(二),Mysql,mysql,数据结构,数据库

联合索引

【Mysql】索引数据结构深入研究(二),Mysql,mysql,数据结构,数据库
如上图,我们建立 nameageposition 的主键联合索引。

联合索引的数据结构是有顺序的,比如它先比较name的值,name的值相同在比较age,age相同在比较postion,可以仔细观察一下上述的图体会一下,然后在索引命中的时候是遵循最左前缀匹配的比如:

select * from table where name ='Bill';
select * from table where age = 30 and position='dev';
select * from table where position = 'dev';

比如上述Sql,只有第一个会命中索引,在或者如下sql

select * from table where age = 30 and position='dev' and name = 'Bill';

这个sql是可以进行索引查询的,因为这种条件的情况下Mysql内部会进行优化。文章来源地址https://www.toymoban.com/news/detail-521131.html

到了这里,关于【Mysql】索引数据结构深入研究(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 索引的数据结构(MySql高级)

    索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章. MySQL中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合

    2024年01月18日
    浏览(45)
  • Mysql——索引相关的数据结构

    我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学

    2024年01月16日
    浏览(41)
  • MySQL数据库索引的数据结构

    数据库索引的功能就是让查找更加的高效,所以索引的数据结构应该是能够加速查找的数据结构。 MySQL的innoDB存储引擎的索引的数据结构就是多叉搜索树中的b+树,这可以说是为索引量身定做的一个数据结构。 首先,索引可以通过主键,unique修饰创建,也可以直接使用sql语句

    2024年02月10日
    浏览(59)
  • 数据结构:Mysql索引原理(通俗易懂)

    在工作中如果经常写业务代码,说白了就是CURD,比如做一个查询功能,我们会将前端参数传递到后端后拼接SQL查询数据,那为了提高用户体验,查询速度肯定是越快越好,这就要求我们能够对SQL调优,让查询速度更快。 由于数据需要持久化,且数据量庞大,所以只能将数据

    2024年02月11日
    浏览(51)
  • mysql索引的数据结构(Innodb)

    首选要注意,这里的数据结构是存储在硬盘上的数据结构,不是内存中的数据结构,要重点考虑io次数. 一.不适合的数据结构: 1.Hash:不适合进行范围查询和模糊匹配查询.(有些数据库索引会使用Hash,但是只能精准匹配) 2.红黑树:可以范围查询和模糊匹配,但是和硬盘io次数比较多. 二

    2024年02月10日
    浏览(56)
  • MySQL基础(二十四)索引的数据结构

    顺序查询和数据使用二叉树结构再进行查询,如图: 2.1 索引概述 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构 。 **索引的本质:**索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方

    2024年02月03日
    浏览(46)
  • 【MySQL数据库 | 第十七篇】索引以及索引结构介绍

    目录 前言: 索引简介:  索引结构:           二叉树索引结构         Tree(普通二叉树)         B-Tree(多路平衡查找树)         B+Tree          哈希索引数据结构 总结: 在实际生活中,我们对SQL语句进行优化实际上有很大一部分都是对索引进行优化,因此对索引

    2024年02月09日
    浏览(76)
  • MySQL学习Day19——索引的数据结构

    一、为什么使用索引: 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据査找时,首先查看查询条件是否命中某条索引,符合则通过索引査找

    2024年02月21日
    浏览(46)
  • MySQL的索引使用的数据结构,事务知识

    一、索引的数据结构 🌸 索引的数据结构(非常重要) mysql的索引的数据结构,并非定式!!!取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存里面,内存里面的数据结构,对于访问操作不敏感,(找数据的过程

    2024年02月10日
    浏览(45)
  • MySQL 底层数据结构 聚簇索引以及二级索引 Explain的使用

    我们知道MySQL的存储引擎Innodb默认底层是使用B+树的变种来存储数据的 下面我们来复习一下B树存储 + B树存储  + 哈希存储的区别 哈希存储,只能使用等值查询 B树与B+树存储 我们知道B+树实际上就是B树的变种 那么为啥使用B+树而不是使用B树呢? 我们知道效率的高低主要取决于

    2024年04月28日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包