MySQL不能在WHERE
条件不包括形成最左侧前缀的列的查找中使用复合索引:
如果列不构成索引的最左前缀,则 MySQL 无法使用索引执行查找。
PostgreSQL 上这个答案的引述引起了我的注意:
这在 Oracle 11 中有些不同,它有时也可以使用不在索引定义开头的列。
在什么情况下,Oracle(至少在 11g 中)可以在查询中不存在最左边的前缀列的情况下进行查找?
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 将在权衡之前使用统计信息来估计步骤 (1) 的基数