可以看到,MySQL 由于代价原因,没有选择联合索引作为 skip scan。
这里涉及了三个概念:covering index、range index、skip scan,我们可能不知道这些概念是什么,稍加搜索就可以获得官方文档的帮助:
https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html#range-access-skip-scan
https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_covering_index
剩下的就是靠大家自己推理和实验获得结论:在这个 SQL 中,组合索引被用作 covering index,成为了全表扫描的替代品。
小贴士
如果大家在 MySQL 5.7 中做这个实验,会发现在 optimizer trace 中找不到相关信息。
MySQL 在 8.0 中对优化器信息的披露进行了增强。以后也推荐大家使用新版本来研究特性,能获得更多的有效信息。