• Mysql--索引分类


    1. 索引分类

    MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。

    在这里插入图片描述

    2. 聚集索引&二级索引

    而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

    在这里插入图片描述
    聚集索引选取规则:

    1. 如果存在主键,主键索引就是聚集索引。
    2. 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
    3. 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

    聚集索引和二级索引的具体结构如下:
    在这里插入图片描述

    • 聚集索引的叶子节点下挂的是这一行的数据 。
    • 二级索引的叶子节点下挂的是该字段值对应的主键值。

    接下来,我们来分析一下,当我们执行如下的SQL语句时,具体的查找过程是什么样子的。
    在这里插入图片描述
    具体过程如下:
    ①. 由于是根据name字段进行查询,所以先根据name='Arm’到name字段的二级索引中进行匹配查找。但是在二级索引中只能查找到 Arm 对应的主键值 10。

    ②. 由于查询返回的数据是*,所以此时,还需要根据主键值10,到聚集索引中查找10对应的记录,最终找到10对应的行row。

    ③. 最终拿到这一行的数据,直接返回即可。

    回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取
    数据的方式,就称之为回表查询。

    思考题:
    以下两条SQL语句,那个执行效率高? 为什么?
    A. select * from user where id = 10 ;
    B. select * from user where name = ‘Arm’ ;
    备注: id为主键,name字段创建的有索引;

    解答:
    A 语句的执行性能要高于B 语句。
    因为A语句直接走聚集索引,直接返回数据。 而B语句需要先查询name字段的二级索引,然后再查询聚集索引,也就是需要进行回表查询。

    思考题:
    InnoDB主键索引的B+tree高度为多高呢?
    在这里插入图片描述
    假设:
    一行数据大小为1k,一页中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数为8。

    高度为2:
    n * 8 + (n + 1) * 6 = 161024 , 算出n约为 1170
    1171
    16 = 18736
    也就是说,如果树的高度为2,则可以存储 18000 多条记录。

    高度为3:
    1171 * 1171 * 16 = 21939856
    也就是说,如果树的高度为3,则可以存储 2200w 左右的记录。

  • 相关阅读:
    LeetCode952三部曲之一:解题思路和初级解法(137ms,超39%)
    Linux内核分析(一)--内核架构和子系统
    [云原生] 初识Kubernetes
    Linux系统调试篇——GDB调试入门
    mysq基础语句+高级操作(学这篇就够了)
    shiro之AccessControlFilter()
    【Go语言】Go语言中的流程控制
    【C++初级】2、浮点数计算
    DDIM代码详细解读(3):核心采样代码、超分辨率重建
    C++ 模板类编译前需要实例化
  • 原文地址:https://blog.csdn.net/weixin_53066120/article/details/136276793