我有一张这样的表:
myTable (id, group_id, run_date, table2_id, description)
我也有这样的索引:
index myTable_grp_i on myTable (group_id)
我过去常常运行这样的查询:
select * from myTable t where t.group_id=3 and t.run_date='20120512';
它工作正常,每个人都很开心。 直到我添加了另一个索引:
index myTable_tab2_i on myTable (table2_id)
我的生活变得悲惨......运行的时间差不多5倍! 执行计划看起来相同(有或没有新索引):
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 220 | 17019
|* 1 | TABLE ACCESS BY INDEX ROWID| MYTABLE | 1 | 220 | 17019
|* 2 | INDEX RANGE SCAN | MYTABLE_GRP_I | 17056 | | 61
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("T"."RUN_DATE"='20120512')
2 - access("T"."GROUP_ID"=3)
我的头上几乎没有头发,为什么另一个未使用的索引在where子句中没有的列上有所作为......
我会更新我检查的内容:
一个。我删除了新索引,运行速度更快
湾我在2个不同的环境中添加了新索引,同样的事情发生了
C。我将MYTABLE_GRP_I更改为列run_date和group_id - 这使它像闪电一样快速运行!!
但为什么会发生呢?