对查询优化器比较了解才能理解为什么没有用索引,而查询优化器是数据库里非常复杂的部分。它的目标是接受用户的SQL语句,生成一个最好的查询计划。
不过这个问题还是比较容易解释的,查询优化器在选择查询计划的时候,会对不同查询计划进行评估(通过一个cost function),选择它认为执行最快的查询计划。
你这个查询可以有两种查询计划,一个是表扫描(table scan),一个是利用索引(B+tree)
至于这两个计划哪个快,需要看具体的数据是怎样的,并不是索引总会比表扫描快,举个例子:
如果你那个表T1有100万行记录,其中50万行的I2都是1,selectivity为50%,这时明显用表扫描快,因为用表扫描,扫描全部100万行记录就可以了。而如果用B+tree,如果底层存储是索引组织表,由于你的I2是非聚簇索引,需要现在I2的B+tree中找I2为1的记录的主键Id,然后再去Id的B+tree中找这个tuple,才能完成一次查找,然后由于非聚簇B+树索引中I2为1的元素所在叶子节点通过指针连接起来了,后面的不需要再在I2的B+tree的根节点出发,直接通过链表可以获得,但仍然需要50万次的Id的B+tree的查找,显然效率很差。虽然如果底层存储为堆表,只需要在I2的B+tree中找就可以了,但仍需要通过指针到底层存储,去获取整个tuple,效率扔不如表扫描。
但如果你那个表中只有1行的I2为1,selectivity几乎为0,那么只需要一次索引扫描就可以了,而用表扫描仍需要扫表整个表的所有数据,因此此时用索引更好。
根据经验来看,selectivity为10%是临界点(使用普通硬盘时),低于10%用索引更优,高于10%用表扫描更优,不过实际上要根据硬件进行调整,比如你用的是普通硬盘还是SSD。
你可以看一下你查询结果的数量,然后和总行数比较一下,比值应该是比较大的。来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3155793/ ,如需转载,请注明出处,否则将追究法律责任。