• 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 左右的记录。

  • 相关阅读:
    docker使用Open Policy Agent(OPA)进行访问控制
    【RTOS训练营】上节回顾、内部机制、中断管理和晚课提问
    MyBatisPlus带你快速入门(1)
    郑卢高速洛阳至洛宁段路基路面综合设计K14+000-K15+400设计计算书+cad图纸
    打造四维软件研发团队(技术 + 产品 + 业务 + 管理)
    Nacos集群搭建
    Android Studio 实现登录注册-源代码 (连接MySql数据库)
    动画设计岗位怎么运用智能程序分析数据更清晰
    Etcd-v3.4.27集群部署
    git rebase合并冗余提交记录
  • 原文地址:https://blog.csdn.net/weixin_53066120/article/details/136276793