• MYSQLg高级------回表


    查看回表之前大家需要 先对 聚簇索引和非聚簇索引 innoDB和MyISAM有一定的了解; 有兴趣看自行查看 :地址

    一、什么是回表?

    这先要从InnoDB的索引实现说起,InnoDB有两大类索引:

    聚集索引(clustered index)

    普通索引(secondary index)

    主键索引包含该行所有数据,普通索引包含的只有该索引和id

    其实非聚集索引 的过程就是所谓的回表;

    通俗的来讲就是:如果select 所需要获得列中有非索引列,一次索引查询不能获取所有的信息,需要到表中找到相应列的ID; 在根据ID去去查询
    对应表中具体的列的数据,这个过程就是回表;而根据一次索引查询就能获取所有列的信息,就不需要回表;(也就是聚集索引)

    CREATE TABLE `user` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(20) DEFAULT NULL,
    `deptId` int(11) DEFAULT NULL,
    PRIMARY KEY (`id`) ,
    KEY `fk_dept_id`(`deptId`)
    )ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
    
    INSERT INTO `atguigudb`.`user` (`id`, `name`, `deptId`) VALUES (1, '小闫', 10);
    INSERT INTO `atguigudb`.`user` (`id`, `name`, `deptId`) VALUES (2, '老闫', 10);
    INSERT INTO `atguigudb`.`user` (`id`, `name`, `deptId`) VALUES (3, '小闫01', 10);
    INSERT INTO `atguigudb`.`user` (`id`, `name`, `deptId`) VALUES (4, '小闫02', 10);
    INSERT INTO `atguigudb`.`user` (`id`, `name`, `deptId`) VALUES (5, '小闫03', 10);
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    执行下面的就不需要回表,因为根据主键查询方式,只需要查询ID这颗B+树即可;主键是唯一的根据这个唯一索引,MYSQL就能确定搜索到这条记录;
    id为主键索引,主键索引就是聚集索引
    聚集索引的叶子节点包含整给行的记录,一次查询就能获取所有的信息,故不需要回表

    # 直接访问id 找到对应的值
    select id,name,deptId FROM USER WHERE name='3';
    
    • 1
    • 2

    下面这个sql就是需要回表的:因为name 是普通的索引,他的查询的方式,需要先查询name的索引树,然后得到id的主键为3,再到id索引树进行一次查询。即先定位主键值,再定位记录,再这个过程中虽然使用了索引,但实际上底层进行了两次索引的查询,这给过程就是回表

    #非聚簇索引 根据值找到id 根据id找到对应的值
    select id,name,deptId FROM USER WHERE name="小闫01";
    select id,name,deptId FROM USER WHERE name='3';
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    详细的 请查看 博客

    希望可以帮助大家更好的理解吧;不足之处,请大家批评指正;

  • 相关阅读:
    Github每日精选(第41期):跨端数据同步加密工具restic
    Android Gradle下载慢
    网页中的宽高度的分类介绍
    MySQL 8.0 架构 之 通用查询日志(General Query Log)
    21. 合并两个有序链表
    Vue (八) --------- 混入、插件与 scope 样式
    量子点表面修饰PEG/抗体/金属/细胞膜/无机材料标记与制备
    Java 数据结构与算法 冒泡排序、快速排序、归并排序
    一个资深测试工程师面试一来就问我这些题目
    数据库的基本操作
  • 原文地址:https://blog.csdn.net/qq_42055933/article/details/126277282