小白学生,实在找不到人问,百度了也不知道结果。
似乎在实际场景中,缓存结果集会更好?
更详细地说:MySql 查询时是对整个表一行一行扫描;还是对与 主键、结果、条件 相关的列,单独一行一行扫描,跳过无关的列?
1
liprais 2020-10-01 20:12:28 +08:00
你想想行存的怎么跳过无关的列?
|
2
crclz 2020-10-01 20:57:48 +08:00
使用“覆盖索引”。
|
3
Jooooooooo 2020-10-01 21:08:38 +08:00 1
你搜下索引结构
就能明白是咋搜索的 |
4
GGGG430 2020-10-01 21:14:46 +08:00 1
看你的 where 条件吧,
如果没有 where 条件, 则直接返回主键索引的所有值 (直接横向扫描主键索引 b+tree 的所有叶子节点, 返回其中存储的 key); 如果有 where 条件且所有列正好用上了一个索引(覆盖索引), 这个时候就只会扫描命中的这个普通索引, 你查的主键值就存储在普通索引的叶子节点中, 直接就返回结果; 如果有 where 条件且查询的部分列用上了索引, 这个时候就会走普通索引-主键索引-服务层一条一条的请求引擎层当前命中的行, 然后根据剩下未命中的列过滤这些数据, 最后返回结果; 如果有 where 条件且没有命中索引, 则全表扫描, 一行一行的调用存储引擎获取每一列的数据; 前面也有人说了, 去了解一下 b+tree 吧, 常见的 InnoDB 和 MyISAM 都用这个 |
5
GGGG430 2020-10-01 21:19:12 +08:00
另外, 一个表冗余另一个的所有主键, 实在没有必要, 无意义
|
6
wangyanrui 2020-10-01 21:21:19 +08:00 via Android
如四楼所述,描述的挺好的,点个赞
|