• 转 MySQL的一级索引和二级索引介绍


    MySQL的一级索引和二级索引介绍

    1、一级索引

    索引和数据存储在一起,都存储在同一个B+tree中的叶子节点。一般主键索引都是一级索引。

    2、二级索引

    二级索引树的叶子节点存储的是主键而不是数据。也就是说,在找到索引后,得到对应的主键,再回到一级索引中找主键对应的数据记录。

    3、例子介绍

    下面我们通过一个具体的示例进行演示一级索引和二级索引。有如下表pl_ranking(编程语言排行榜表),该表包含3个字段,如下:

    id:主键
    plname:编程语言名称
    ranking:排名
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    3.1 主键索引结构

    在这里插入图片描述
    从图中我们可以看到,索引和数据都在一颗树的叶子节点,是存在一起的。通过定位索引就直接可以查找到数据。如果查找id=16的编程语言

    select id, plname, ranking from pl_ranking where id=16;

    则只需要读取3个磁盘块,就可以获取到数据。

    3.2 非主键索引结构

    如果根据字段plname创建索引,B+树结构如下:
    在这里插入图片描述
    从上图中我们发现,该B+tree根据plname列进行构建的,只存储一级索引数据。比如,查找编程语言为“Java”的数据

    select id, plname, ranking from pl_ranking where plname=‘Java’;

    首先通过二级索引树中找到Java对应的主键id为 “16”(读取2个磁盘块)。然后在去主键索引中查找id为“16” 的数据(读取3个磁盘块)。

    3.3 一级索引和二级索引的关系:回表

    一级索引可以单独存在,二级索引不能单独存在,必须依附于一级索引,这叫做“回表”。

    4.0 二级索引存储主键值而不是存储数据优缺点

    优点:

    ##########sample 2 

    聚簇索引和二级索引介绍

    其中  聚簇索引 对应着主键索引和一级索引。

    其中 二级索引 对应着普通索引。

    前言
      本篇文章主要介绍聚簇索引和二级索引的区别,以及从存储结构出发怎样更有效地优化SQL。

    一、索引介绍
    1.目的
    更快地查询到想要的数据

    2.实现方式
    在写数据(增、删、改)时动态维护指定的数据结构,每个数据结构都是一个索引;查询时根据某个数据结构来查询。

    3.举个栗子
      一本3000页的《三国演义》对应数据库的一张表,目录对应索引,内容对应表中的数据。
      想要查看第21章的内容,不使用索引时,最坏的情况可能需要翻3000页。使用索引的话,只需翻开书的目录(目录可能占据5页),然后发现第21章在1689页,进而直接翻开1689页即可。

    二、索引创建与查询
    创建一张表,并插入5条数据

    CREATE TABLE `person` (
    `id` int NOT NULL AUTO_INCREMENT,
    `name` varchar(255) DEFAULT NULL,
    `age` int DEFAULT NULL,
    PRIMARY KEY (`id`)
    );

    INSERT INTO `person`(`id`, `name`, `age`) VALUES (1, 'Jack', 12);
    INSERT INTO `person`(`id`, `name`, `age`) VALUES (2, 'Bob', 13);
    INSERT INTO `person`(`id`, `name`, `age`) VALUES (3, 'Jession', 11);
    INSERT INTO `person`(`id`, `name`, `age`) VALUES (4, 'Lisa', 14);
    INSERT INTO `person`(`id`, `name`, `age`) VALUES (5, 'Haro', 16);

    1. 聚簇索引
    每张表都有对应的聚簇索引,MySQL优先按主键建立聚簇索引;如果你没有指定主键,使用唯一键;如果连唯一键也没有,mysql会自动建一个rowid字段,用它来组织这棵 B+树

    按主键建立聚簇索引,存储结构如图所示:

    聚簇索引的叶子节点包含数据行,id大于3的数据放在右边,小于3的数据放在左边。
    如果各位想了解这棵树是怎么构造起来的,可以参考构造B+树网站,自己手动构造下。

    查询
    select * from person where id = 5;
    1
    此时MySQL就会使用聚簇索引查询,依次查询到3-4-5,此时就能直接获取到id=5的数据。

    2. 二级索引
    -- 创建普通索引
    CREATE INDEX idx_name ON person (name);

    创建二级索引,存储结构如图所示:

    可以看到,二级索引的叶子节点存储的是主键值。

    查询
    select * from person where name = 'Jack';
    1
    这样的查询会经过两个步骤,
    1. 先在二级索引的B+树中查到Jack对应的主键id值为1;
    2. 然后拿主键id值,去聚簇索引中查询真正的数据。

    三、SQL优化思路
    1. 磁盘
    不要建立太多索引,这样会建立很多B+树,很占磁盘容量。
    一个索引中的字段不要太多,否则树中的每个节点都很大。
    2. 写操作
    尽量少创建无用的索引。因为每个写操作执行时,都会更新所有索引对应的B+树。
    3. 查询
    尽量不要使用select * 。如果select 后面的字段都是二级索引中的字段,MySQL就不会再去聚簇索引中查找完整数据了。
    四、总结
    聚簇索引
    B+树的数据结构,叶子节点包含完整的数据行。
    每张表都有自己的聚簇索引。
    二级索引
    B+树的数据结构,叶子节点仅包含数据的主键。
    用户每创建一个索引,就会生成一颗B+树。
    使用二级索引查询完整数据行时,会执行两个步骤:先查二级索引,然后再查聚簇索引。
    ————————————————
    版权声明:本文为CSDN博主「Bronze5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Bronze5/article/details/107792063

  • 相关阅读:
    很好的Socket教程
    TcpClient 错误"不能做任何连接,因为目标机器积极地拒绝它" 的解决
    Tcp通信 暑期学习笔记(二)
    svn1.5+TortoiseSVN1.5+VisualSVN1.5
    进程、线程、应用程序域 暑期学习笔记(一)
    线程状态(转)
    Udp通信 暑期学习笔记(三)
    杜婧/于洋(为奥运冠军名字作诗)
    王峰(为奥运冠军名字作诗)
    刘子歌(为奥运冠军名字作诗)
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/16613585.html
Copyright © 2020-2023  润新知