mysql索引解析「终于解决」

mysql索引解析「终于解决」1、基本概念 数据读写性能主要是IO次数,单次从磁盘读取单位是页,即便只读取一行记录,从磁盘中也是会读取一页的()单页读取代价高,一般都会进行预读) (1)扇区是磁盘的最小存储单元 (2)块是文件系统

mysql索引解析

1、基本概念

  数据读写性能主要是IO次数,单次从磁盘读取单位是页,即便只读取一行记录,从磁盘中也是会读取一页的()单页读取代价高,一般都会进行预读)

  (1)扇区是磁盘的最小存储单元

  (2)块是文件系统的最小存储单元,比如你保存一个记事本,即使只输入一个字符,也要占用4KB的存储,这就是最小存储的意思

  (3)页是B+树的最小存储单元

单元 谁的(归属) 最小大小
扇区 磁盘 512B
文件系统 4K
B+ 16K

 

 

 

 

 

2、有无索引的读取数据比较

  无索引情况下,会直接在磁盘中读取经过多次IO才能找到需要的数据,首先读取这个扇区的数据,需要将磁头放到这个扇区上方,这个过程叫做寻道,花费时间叫做寻道时间,然后磁盘旋转将目标扇区旋转到磁头下,这个过程耗时叫旋转耗时,磁盘读取数据时间包含寻道和旋转时间。

  有索引情况下,会读取索引数据经过几次IO就能找到需要的数据下面计算通过索引(B+TREE,主键id采用bigint占用8字节,一行数据占用1KB)计算:

  (1)第一层
  一个页16K,每一个索引键的大小8字节(bigint)+6字节(指针大小),因此第一层可存储16*1024/14=1170个索引键。

  (2)第二层
  第二层只存储索引键,能存储多少个索引键呢?1170(这么多个页,有第一层延伸的指针)1170(每页的索引键个数,跟第一步计算一致)=1368900
如果第二层存储数据呢?1170(这么多个页,有第一层延伸的指针)16(16KB的页大小/1KB的数据大小)=18720,也就是能存储一万多条数。

  (3)第三层

  直接看三层能存储多少数据?1170*1170*16=21902400,是不是很强大,此处应该有掌声和鲜花,3次IO就可以查询到2千多万左右的数据,也就是这么大的数据量如果通过主键索引来查找是很快,这就是explain一个sql时,type=const为什么性能是最优的。

3、mysql索引类型

  表级别索引设置

(1)应用层:唯一索引,普通索引,复合索引

(2)存储结构:BTree(BTree或B+Tree)、Hash索引,full-index全文索引,R-Tree索引。

(3)数据物理顺序与键值逻辑:聚集索引,非聚集索引。

  聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。

  聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。 一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。

  聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

4、B-TREE

(1)特点

  B-树相对B树,B-树的各层节点要存储数据,导致每页能够容纳的节点就很少,直接导致树深度加大

mysql索引解析「终于解决」

(2)实例

 mysql索引解析「终于解决」

mysql索引解析「终于解决」

5、B+TREE

(1)特点

 mysql索引解析「终于解决」

  (2)实例

 mysql索引解析「终于解决」

  mysql索引解析「终于解决」

6、MyISAM的索引结构

  MyISAM有三个文件,.frm,MYD,MYI分别是表结构,表数据,表索引。先查找主键值对应的value,然后根据value查找对应的行

 mysql索引解析「终于解决」

  7、innodb索引结构

  InnoDB存储引擎就是用B+Tree实现其索引结构。由frm,ibd文件组成,主键索引存储数据,非主键索引存储主键数据

 mysql索引解析「终于解决」

  mysql索引解析「终于解决」

  8、innodb和myisam主键索引和其他索引区别

 mysql索引解析「终于解决」

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

(0)
上一篇 2023-02-28
下一篇 2023-02-28

相关推荐

  • 无效的Python SDK

    无效的Python SDKPython是一门高级编程语言,其简单易用、灵活多变的特点受到了众多开发者的喜爱。在Python生态圈中,开发者可以便捷地使用各种SDK开发自己的应用。但是,尽管Python的生态圈已经相当成熟和完善,仍然有一些Python SDK存在问题。本文主要讨论无效的Python SDK,这类SDK通常存在着质量不佳、未经充分测试、文档不完整等问题,使它们在生产环境中难以使用。

    2024-07-31
    39
  • Java中使用Jedis连接Redis对Key进行操作的常用命令

    Java中使用Jedis连接Redis对Key进行操作的常用命令场景 Java中使用Jedis连接池连接Redis数据库流程: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/104914320

    2023-02-06
    140
  • 麒麟820 荣耀30s_麒麟可以随便买吗

    麒麟820 荣耀30s_麒麟可以随便买吗 荣耀30S发布已经有一段时间,自始至终这款手机的焦点都是在麒麟820处理器上,那么这款处理器对荣耀30S和荣耀手机在哪些方面有影响呢?   首先从时间节点上看,荣耀30S是荣耀2020的开年之作,…

    2023-02-22
    143
  • Redis 高可用之”持久化”「建议收藏」

    Redis 高可用之”持久化”「建议收藏」Redis高可用概述 在Redis中,实现高可用的技术主要包括:持久化、复制(读写分离)、哨兵、集群。 持久化: 持久化是最简单的高可用方法(有时甚至不被归为高可用手段),主要作用是数据备份,即将数据

    2022-12-30
    131
  • Ubuntu安装Anaconda教程

    Ubuntu安装Anaconda教程Python作为一种广泛使用的编程语言,开发者往往需要使用其强大的第三方库,而安装这些库依赖于Python的包管理工具pip。不过pip的使用需要Python环境的支持,而在不同的操作系统和版本中,安装Python与安装第三方库依赖的工具并不相同。因此,本篇文章将为大家介绍如何在Ubuntu系统中安装Anaconda。

    2024-07-21
    34
  • datatype数据类型_navicat各种数据类型

    datatype数据类型_navicat各种数据类型1、常用数据类型映射表: 2、日期时间和大对象映射表。

    2023-01-29
    161
  • 了解Python的Wheel模块

    了解Python的Wheel模块Python是一种优秀的编程语言,广泛应用于Web开发、科学计算、人工智能等领域。Python的包管理系统pip可以方便地安装和管理库,但是在安装一些特殊的库时,可能会遇到一些问题。传统的Python库通常是一个压缩包,需要经过编译才能在本地安装使用。这种方式在不同操作系统和版本之间移植不方便,耗时耗力。为了解决这个问题,Python社区推出了Wheel模块。

    2024-05-09
    70
  • isleap用法python(c语言isleap什么意思)

    isleap用法python(c语言isleap什么意思)直接使用python calender模块即可。

    2023-10-31
    147

发表回复

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