首页 > 代码库 > 蛋疼的郁闷-聚集索引扫描、非聚集索引扫描、表扫描区别

蛋疼的郁闷-聚集索引扫描、非聚集索引扫描、表扫描区别

       本文适用于对数据库索引有一定深入的攻城师阅读参考。
      我们对于聚集索引扫描和表扫描比较容易理解的,但是对于非聚集索引扫描不太容易理解,这一点也往往容易使初学者感到很是困惑,原因是总认为没必要存在非聚集索引扫描,因为如果查询结果不具有高选择性的话,在聚集索引表中可以使用聚集索引扫描,在对表中会使用表扫描的,那么为什么要会存在非聚集索引扫描呢?
     之所以有这样的问题,是因为我们没有考虑到一种情况,那就是查询结果如果被建有非聚集索引的字段覆盖或包含了,而此时where条件字段上的非聚集索引对于本次查询结果又不具有高选择性,那么你说查询优化器会选择怎样的查询计划呢?1、非聚集索引查找?这肯定不行,因为结果集不具有高选择性。2、聚集索引扫描(或表扫描)?答案也不是,因为前两者开销还是比较大的。我们的优化器何不选择该非聚集索引呢?只要对该该索引执行一次扫描,那么查询根本不用访问数据页,因为查询结果字段都被该索引覆盖或包含了,这个代价可比前两者小多了。
       哈哈!