MySQL不能在查找中使用复合索引,在查找中,WHERE条件不包括构成最左边前缀的列:
如果列没有形成索引的最左边前缀,则MySQL无法使用索引执行查找。
这个答案在PostgreSQL上的一句话引起了我的注意:
这在Oracle 11中有些不同,它有时也可以使用不在索引定义开头的列。
在什么情况下,Oracle (至少在11g中)可以在没有查询中存在的最左边前缀列的情况下进行查找?
发布于 2011-10-05 18:04:42
粗略地说,国会预算办公室可以选择:
在Oracle术语中,这就是所谓的“跳过扫描”。当步骤(1)中的可能值的数量相对较小时,跳过扫描的效果最好(与索引的大小相比,这是很小的)。
在什么情况下,Oracle (至少在11g中)可以在没有查询中存在的最左边前缀列的情况下进行查找?
Oracle将使用统计数据对步骤(1)的基数进行估计,然后再进行权衡,如果执行这么多的范围扫描将不仅仅是按顺序扫描整个索引。
发布于 2011-10-05 15:23:49
在Oracle中,我们有一个叫做索引跳过扫描的特性,即使在WHERE条件下没有指定索引的前导(最左边)部分,也可以从复合索引中受益。这是一个9i新特性,记录在这里:http://download.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm
https://dba.stackexchange.com/questions/6539
复制相似问题