索引使用判断:指定测试环境下哪个查询会用dept_deptname_idx索引?
索引使用判断分析
先给明确结论:第一个查询(SELECT deptid from dept where deptname ='SAPA';)会使用dept_deptname_idx索引,第二个查询大概率不会使用该索引。
下面结合测试环境的特点拆解具体原因:
- 先明确测试环境的核心数据:dept表共1000行,deptname有10个均匀分布的唯一值,意味着每个deptname对应100行数据,占总行数的10%。
第一个查询的索引使用逻辑
对于SELECT deptid from dept where deptname ='SAPA';:
- 这个查询仅需匹配100行数据,占比仅10%。数据库优化器会判断:通过
dept_deptname_idx索引可以快速定位到所有符合条件的条目,效率远高于全表扫描。 - 如果你用的是InnoDB引擎,二级索引(比如这里的
dept_deptname_idx)会自动包含主键列(假设deptid是主键),所以这个查询属于覆盖索引查询——直接从索引里就能拿到需要的deptid,连回表操作都省了,优化器必然优先选择走索引。
第二个查询的索引放弃逻辑
对于SELECT deptid from dept where deptname <>'SAPA';:
- 这个查询需要返回900行,占总行数的90%。此时优化器会核算成本:如果走索引,需要遍历索引中除了'SAPA'之外的90%条目,哪怕是覆盖索引,遍历这么大比例的索引条目,开销和全表扫描差不多甚至更高。
- 全表扫描可以一次性读取连续的数据页,反而比反复从索引跳转到数据页(非覆盖索引场景)更高效。所以优化器通常会放弃索引,选择全表扫描。
内容的提问来源于stack exchange,提问作者polin11
相关产品推荐
相关产品推荐

