• 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

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

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

  • 相关阅读:
    不止八股:阿里内部语雀一些有趣的并发编程笔试题1——一半容量才可以出队的阻塞队列
    云原生|kubernetes|静态pod和静态pod的应用
    异行星低代码平台--第三方插件对接:企业微信平台对接(二)
    产品团队的需求验证和确认
    图搜索的经典启发式算法A星(A*、A Star)算法详解
    洛谷P6672 你的生命已如风中残烛
    基于QT的opencv照片美颜及背景更换
    Jenkins部署springboot项目至远程服务器
    微信小程序(基础语法)
    小哥用Python兼职月入过万,用Python做项目有多赚钱?
  • 原文地址:https://blog.csdn.net/qq_42055933/article/details/126277282