mysql索引 数据结构_903数据结构B

mysql索引 数据结构_903数据结构B1.聚集索引和辅助索引 在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着

MySQL索引的数据结构-B+树介绍

1.聚集索引和辅助索引

在数据库中,B+树的高度一般都在24层,这也就是说查找某一个键值的行记录时最多只需要2到4次IO,这倒不错。因为当前一般的机械硬盘每秒至少可以做100次IO,24次的IO意味着查询时间只需要0.02~0.04秒。

数据库中的B+树索引可以分为聚集索引(clustered index)和辅助索引(secondary index),

聚集索引与辅助索引相同的是:不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,叶子结点存放着所有的数据。

聚集索引与辅助索引不同的是:叶子结点存放的是否是一整行的信息

2.聚集索引
InnoDB存储引擎表是索引组织表,即表中数据按照主键顺序存放。 而聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称为数据页。 聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+树数据结构一样,每个数据页都通过一个双向链表来进行链接。

如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使用它作为聚簇索引。

如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。

由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。 在多数情况下,查询优化器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。 此外由于定义了数据的逻辑顺序,聚集索引能够特别快地访问针对范围值得查询。

聚集索引的好处之一:它对主键的排序查找和范围查找速度非常快,叶子节点的数据就是用户所要查询的数据。如用户需要查找一张表,查询最后的10位用户信息,由于B+树索引是双向链表,所以用户可以快速找到最后一个数据页,并取出10条记录

聚集索引的好处之二:范围查询(range query),即如果要查找主键某一范围内的数据,通过叶子节点的上层中间节点就可以得到页的范围,之后直接读取数据页即可。

 

3.辅助索引
表中除了聚集索引外其他索引都是辅助索引(Secondary Index,也称为非聚集索引),与聚集索引的区别是:辅助索引的叶子节点不包含行记录的全部数据。

叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含一个书签(bookmark)。该书签用来告诉InnoDB存储引擎去哪里可以找到与索引相对应的行数据。

由于InnoDB存储引擎是索引组织表,因此InnoDB存储引擎的辅助索引的书签就是相应行数据的聚集索引键。

辅助索引的存在并不影响数据在聚集索引中的组织,因此每张表上可以有多个辅助索引,但只能有一个聚集索引。

当通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并通过叶子级别的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。

举例来说,如果在一棵高度为3的辅助索引树种查找数据,那需要对这个辅助索引树遍历3次找到指定主键,如果聚集索引树的高度同样为3,那么还需要对聚集索引树进行3次查找,最终找到一个完整的行数据所在的页,因此一共需要6次逻辑IO访问才能得到最终的一个数据页。

 

4.聚集索引和非聚集索引的区别
4.1聚集索引
a)纪录的索引顺序与无力顺序相同 因此更适合between and和order by操作
b)叶子结点直接对应数据 从中间级的索引页的索引行直接对应数据页
c)每张表只能创建一个聚集索引

4.2非聚集索引
a)索引顺序和物理顺序无关
b)叶子结点不直接指向数据页
c)每张表可以有多个非聚集索引,需要更多磁盘和内容
d)多个索引会影响insert和update的速度

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/8980.html

(0)
上一篇 2023-02-18 10:00
下一篇 2023-02-18

相关推荐

  • Mysql 命令行下更好的显示查询结果

    Mysql 命令行下更好的显示查询结果 Mysql 命令行下更好的显示查询结果 虽然自己很不愿意“破事水”,但是终究还是很实用的技能,mark一下 Mysql 以G结束查询语句 postgresql 以x结束查询语句 …

    2023-03-21
    165
  • 快速填充字符串的Python zfill方法

    快速填充字符串的Python zfill方法在Python编程语言中,我们通常需要填充字符串以达到一定的长度。为了解决这个问题,Python提供了很多内置的方法,其中最常用的一个是zfill方法。本文将介绍Python zfill方法的详细用法和实际应用场景。

    2024-04-12
    70
  • 0. 数据库设计规范化「建议收藏」

    0. 数据库设计规范化「建议收藏」数据库规范化 第一范式: 字段不可再分 1NF(第一范式)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。 第二范式: 非主键字

    2023-05-26
    145
  • 基于PyCharm的Python开发环境

    基于PyCharm的Python开发环境PyCharm是一个专业的Python IDE,由JetBrains公司开发,提供了各种高级功能,支持Python编译器及其他语言的集成开发环境。相比其他Python集成开发环境,PyCharm有更强大的特性和更好的性能,使Python开发更加高效、易于使用和可维护。

    2024-06-08
    52
  • 蓝牙耳机什么牌子好?音质和降噪双优选手才值得拥有「终于解决」

    蓝牙耳机什么牌子好?音质和降噪双优选手才值得拥有「终于解决」     蓝牙耳机作为产品界日益火热的宠儿,以其方便操作和携带的优点成为耳机爱好者的心头好。众多品牌为了跟随潮流,同时给予用户足够的满足感,也竞相将精力投入到蓝牙耳机的研发中。蓝牙耳机什么牌子好?个…

    2023-02-19
    154
  • 数据库的增删改查_数据库删除查询怎么做

    数据库的增删改查_数据库删除查询怎么做
    1、建立表格 create table person( ///person是要创建的表格名称 id int primary key, ///表示自增 nam…

    2023-04-08
    158
  • Python ord()函数: 将字符转换成对应的ASCII码值

    Python ord()函数: 将字符转换成对应的ASCII码值ASCII(American Standard Code for Information Interchange)码是一种将每个字符与对应数字相关联的字符编码标准,包括英文字母、数字以及常用标点符号等。ASCII码共计128个,对于每一个字符,都有一个唯一的对应ASCII码。

    2024-01-02
    117
  • 基于PyCharm和Jupyter的Python开发

    基于PyCharm和Jupyter的Python开发Python是一种高级的、面向对象的解释型编程语言,在数据科学、机器学习、Web开发、游戏开发等诸多领域都有广泛的应用。Python的简单易学、高效性、可读性等特点使其成为了一种非常流行的编程语言。而PyCharm和Jupyter则是Python中常用的两个开发环境,其中PyCharm是一款专业的Python集成开发环境,Jupyter则是一种Web应用,可以创建和共享文档,其中包括实时代码、方程式、可视化图表等。

    2024-08-05
    32

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注