《MySQL性能调优与架构设计》的8.6.2的Tight Index Scan的例子不好,容易认为这种算法没有存在意义,建议还是用refman上的例子吧。因为既然条件是group_id = 2,是固定的,那么GROUP BY user_id和GROUP BY group_id,user_id是一样的,我测试过,两者的执行计划一个是Tight Index Scan一个是Loose Index Scan,开发只要记得写成后者的样子就可以避免Tight Index Scan了,总感觉Tight的算法没有用了,赶紧查了refman,看了上面的例子才恍然大悟。
另外:第一种Loose Index Scan的例子,如果单向的范围(=,<,>)限定改成双向的(有>,>=也有<,<=)的话将使用Tight Index Scan了。根据B-TREE的特性,可以理解不能只访问GROUP BY汇总到的部分了,必须全范围的遍历。
第二种Tight Index Scan和第三种临时表实现方法的两个例子的区别也是前者是单向,后者是双向。