一元钱包邮 2022-10-10 17:19 采纳率: 0%
浏览 47

mysql避免回表问题

避免回表问题__

mysql数据库 innodb

CREATE TABLE `abc_innodb`
(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `a`  int(11)     DEFAULT NULL,
  `b`  int(11)     DEFAULT NULL,
  `c`  varchar(10) DEFAULT NULL,
  `d`  varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_abc` (`a`, `b`, `c`)
) ENGINE = InnoDB;

可以通过创建联合索引,索引覆盖的方式避免回表
问题1: 联合索引页字节点储存的是主键,是怎么避免回表的? 难道叶子结点还存 索引列数据?

select a, b from abc_innodb where a = 1 and b = 2 and c= 3;

CREATE TABLE `user_innodb`
(
  `id`       int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `age`      int(11)     DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_age` (`age`) USING BTREE
) ENGINE = InnoDB;

问题2: 表中一列创建普通索引, 查询结果就是就是索引列,是否可以避免回表 ?

select age from abc_innodb where age = 1 ;
  • 写回答

3条回答 默认 最新

  • 夜郎king 2022博客之星IT其它领域TOP 12 2022-10-11 08:22
    关注

    问题1:在索引中其实也是存了索引数据的,在你的idx_abc这个索引里,是包含了a、b、c三个字段的信息,因此在select的时候,可以直接从索引文件中查找到值直接返回即可,不需要回到表中去查询,如果此时再在一个不在索引中的e列,就需要回到表中去检索,然后将结果合并返回。
    问题2:凡是索引中有数据的,都不会回表查询。

    希望可以帮助你。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月10日

悬赏问题

  • ¥15 ensp路由器启动不了一直报#
  • ¥50 安卓10如何在没有root权限的情况下设置开机自动启动指定app?
  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题