MySQL高级(索引分类-聚集索引-二级索引)

目录

1、主键索引、唯一索引、常规索引、全文索引

2、 聚集索引、二级索引

3、回表查询

4、通过id查询和通过name查询那个执行效率高?

5、 InnoDB主键索引的 B + tree 高度为多高呢?


1、主键索引、唯一索引、常规索引、全文索引

  • 在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。
分类 含义 特点 关键字
主键索引 针对于表中主键创建的索引 默认自动创建,只能有一个 primary
唯一索引 避免同一个表中某数据列中的值重复 可以有多个 unique
常规索引 快速定位特定数据 可以有多个
全文索引 全文索引查找的是文本中的关键词,而不是比较索引中的值 可以有多个 fulltext

2、 聚集索引、二级索引

  • 在  InnoDB 存储引擎中,根据索引的存储形式,又可以分为以下两种:
分类 含义 特点
聚集索引(Clustered Index) 将数据存储与索引放到了一块,索引结构的叶子节点保存了 行数据 必须有,而且只有一个
二级索引(Secondary Index) 将数据与索引分开存储,索引结构的叶子节点关联的是 对应的主键 可以存在多个

聚集索引选取规则:

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

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

 接下来,我们来分析一下,当我们执行如下的SQL语句时,具体的查找过程是什么样子的。

 具体过程如下:

  1. 由于是根据 name 字段进行查询,所以先根据 name = ‘Arm’ 到  name 字段的二级索引中进行匹配查找。但是在二级索引中只能查找到 Arm 对应的主键值 10.
  2. 由于查询返回的数据是 * ,所以此时,还需要根据主键值 10,到聚集索引中查找 10 对应的记录,最终找到 10 对应的行 row 。
  3. 最终拿到这一行的数据,直接返回即可。

 3、回表查询

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

 4、通过id查询和通过name查询那个执行效率高?

  以下SQL语句,那个执行效率高?为什么?

select * from user where id = 10;
select * from user where name = 'Arm';

  备注:id 为主键,name字段创建的有索引;

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

5、 InnoDB主键索引的 B + tree 高度为多高呢?

     如果树的高度为 3 就类似于 下面这张图的结构

假设:

        一行 数据大小为 1 k一页 中可以存储 16 行 这样的数据。InnoDB的指针占用 6 个字节的空间,主键即使为 bigint,占用字节数为 8 。

        

         8 bit = 1 Byte

        1024 Byte = 1KB

        1024 KB = 1MB

        1024 MB =1GB

        1024 GB = 1TB

高度为 2
n 是 键值数量 n + 1 是 指针数量

n * 8 +(n+1)* 6 = 16 * 1024 ,

算出 n 约为 1170,n + 1 = 1171。

1171 * 16  =  18736

也就是说,如果树的高度为 2 ,则可以存储 18000 多条记录。1万8 多条。

        

高度为 3
n 是 键值数量 n + 1 是 指针数量

1171 *  1171  *  16 = 21939856

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

       

       

相关推荐

  1. MySQL中的聚集索引和非聚集索引

    2024-04-11 12:58:01       55 阅读
  2. MySQL索引分类

    2024-04-11 12:58:01       47 阅读
  3. 索引

    2024-04-11 12:58:01       23 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-11 12:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-11 12:58:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-11 12:58:01       82 阅读
  4. Python语言-面向对象

    2024-04-11 12:58:01       91 阅读

热门阅读

  1. 数据结构-算法复杂度

    2024-04-11 12:58:01       39 阅读
  2. 【算法基础】第二章:数据结构

    2024-04-11 12:58:01       25 阅读
  3. 2024-04-10 问AI: 在深度学习中,Adam优化器是什么?

    2024-04-11 12:58:01       41 阅读
  4. Android 事件分发

    2024-04-11 12:58:01       28 阅读
  5. About Pycharm

    2024-04-11 12:58:01       33 阅读
  6. 红米手机怎么安装charles证书(Redmi K70)

    2024-04-11 12:58:01       34 阅读
  7. C语言 获取系统时间

    2024-04-11 12:58:01       32 阅读
  8. Objective-C学习笔记(内存管理、property参数)4.9

    2024-04-11 12:58:01       28 阅读