V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Eridani117
V2EX  ›  问与答

MySql 单表查询,只需查出所有主键,建立冗余表是否能提升性能。(SELECT A.id FROM A)

  •  
  •   Eridani117 · 2020-10-01 20:09:54 +08:00 · 975 次点击
    这是一个创建于 1506 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小白学生,实在找不到人问,百度了也不知道结果。
    似乎在实际场景中,缓存结果集会更好?
    更详细地说:MySql 查询时是对整个表一行一行扫描;还是对与 主键、结果、条件 相关的列,单独一行一行扫描,跳过无关的列?

    6 条回复    2020-10-01 21:21:19 +08:00
    liprais
        1
    liprais  
       2020-10-01 20:12:28 +08:00
    你想想行存的怎么跳过无关的列?
    crclz
        2
    crclz  
       2020-10-01 20:57:48 +08:00
    使用“覆盖索引”。
    Jooooooooo
        3
    Jooooooooo  
       2020-10-01 21:08:38 +08:00   ❤️ 1
    你搜下索引结构

    就能明白是咋搜索的
    GGGG430
        4
    GGGG430  
       2020-10-01 21:14:46 +08:00   ❤️ 1
    看你的 where 条件吧,

    如果没有 where 条件, 则直接返回主键索引的所有值 (直接横向扫描主键索引 b+tree 的所有叶子节点, 返回其中存储的 key);

    如果有 where 条件且所有列正好用上了一个索引(覆盖索引), 这个时候就只会扫描命中的这个普通索引, 你查的主键值就存储在普通索引的叶子节点中, 直接就返回结果;

    如果有 where 条件且查询的部分列用上了索引, 这个时候就会走普通索引-主键索引-服务层一条一条的请求引擎层当前命中的行, 然后根据剩下未命中的列过滤这些数据, 最后返回结果;

    如果有 where 条件且没有命中索引, 则全表扫描, 一行一行的调用存储引擎获取每一列的数据;

    前面也有人说了, 去了解一下 b+tree 吧, 常见的 InnoDB 和 MyISAM 都用这个
    GGGG430
        5
    GGGG430  
       2020-10-01 21:19:12 +08:00
    另外, 一个表冗余另一个的所有主键, 实在没有必要, 无意义
    wangyanrui
        6
    wangyanrui  
       2020-10-01 21:21:19 +08:00 via Android
    如四楼所述,描述的挺好的,点个赞
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   951 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.