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

2020-10-01 20:09:54 +08:00
 Eridani117

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

981 次点击
所在节点    问与答
6 条回复
liprais
2020-10-01 20:12:28 +08:00
你想想行存的怎么跳过无关的列?
crclz
2020-10-01 20:57:48 +08:00
使用“覆盖索引”。
Jooooooooo
2020-10-01 21:08:38 +08:00
你搜下索引结构

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

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

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

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

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

前面也有人说了, 去了解一下 b+tree 吧, 常见的 InnoDB 和 MyISAM 都用这个
GGGG430
2020-10-01 21:19:12 +08:00
另外, 一个表冗余另一个的所有主键, 实在没有必要, 无意义
wangyanrui
2020-10-01 21:21:19 +08:00
如四楼所述,描述的挺好的,点个赞

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712117

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX