MySQL不能在WHERE
条件不包括构成最左边前缀的列的查找中使用复合索引:
如果列不构成索引的最左边前缀,MySQL 不能使用索引来执行查找。
来自这个关于 PostgreSQL 的回答的引述引起了我的注意:
这在 Oracle 11 中有些不同,它有时也可以使用不在索引定义开头的列。
在什么情况下 Oracle(至少在 11g 中)可以在查询中不存在最左侧前缀列的情况下进行查找?
在 Oracle 中,我们有一个称为索引跳过扫描的功能,即使在 WHERE 条件中未指定索引的前导(最左侧)部分,也可以从复合索引中受益。这是9i 新功能,记录在此处:http : //download.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm
简而言之,CBO 可以选择:
这就是 Oracle 术语中所谓的“跳过扫描”。当步骤 (1) 中可能值的数量相对较小(与索引的大小相比较小)时,跳过扫描效果最佳
在什么情况下 Oracle(至少在 11g 中)可以在查询中不存在最左侧前缀列的情况下进行查找?
如果执行那么多范围扫描比顺序扫描整个索引花费更多,Oracle 将在权衡之前使用统计信息来估计步骤 (1) 的基数
归档时间: |
|
查看次数: |
1959 次 |
最近记录: |