ORACLE 復合索引在什麼情況下會被用到

2021-06-29 08:12:42 字數 2899 閱讀 2770

在論壇裡看到有人問,有三個列的復合索引,查詢條件中只包含兩個列是不是就不會走索引了?

經過試驗,我發現兩點:

1. 只要某查詢條件中包含復合索引中的第乙個列,該查詢就會走索引,如果不包含,怎麼樣都不會走索引。

什麼意思呢?比如說我建立個索引:

create index idx1_test on test(c1,c2,c3);

當切僅當查詢條件中包含c1時,此查詢就會走idx1_test索引,否則無論如何都不會走索引。

sql> select * from test where c1 = '1' and c2 = '2';

| id  |operation                    | name    | rows  | bytes | cost (%cpu)|time     |

|   0 | selectstatement           |               |    1 |    48 |    0         (0)| 00:00:01 |

|   1 |  table access by index rowid| test     |    1 |    48 |    0         (0)| 00:00:01 |

|*  2 |   index rangescan            | idx_test |     1 |      |    0         (0)| 00:00:01 |

sql> select * from test where c1 = '1' and c3 = '3';

| id  |operation                    | name    | rows  | bytes | cost (%cpu)|time     |

|   0 | selectstatement           |               |    1 |    48 |    2         (0)| 00:00:01 |

|   1 |  table access by index rowid| test     |    1 |    48 |    2         (0)| 00:00:01 |

|*  2 |   index rangescan            | idx_test |     1 |      |    1         (0)| 00:00:01 |

sql> select * from test where c3 = '3' and c2 = '2';

| id  |operation          | name | rows | bytes | cost (%cpu)| time        |

|   0 | select statement |         |     1 |   48 |     3   (0)| 00:00:01 |

|*  1 |  table access full| test |     1 |   48 |     3   (0)| 00:00:01 |

2. 第二點,是否走索引與查詢中的條件排列順序是無關的。無論第一列在條件中排在什麼位置,只要有他,就會走索引。

sql> select * from test where c3 = '3' and c1 = '1';

| id  |operation                    | name    | rows  | bytes | cost (%cpu)|time     |

|   0 | selectstatement           |               |    1 |    48 |    2         (0)| 00:00:01 |

|   1 |  table access by index rowid| test     |    1 |    48 |    2         (0)| 00:00:01 |

|*  2 |   index rangescan            | idx_test |     1 |      |    1         (0)| 00:00:01 |

predicate information (identified by operation id):

2 -access("c1"='1' and "c3"='3')

filter("c3"='3')

sql> select * from test where c1 = '1' and c3 = '3';

| id  |operation                    | name    | rows  | bytes | cost (%cpu)|time     |

|   0 | selectstatement           |               |    1 |    48 |    2         (0)| 00:00:01 |

|   1 |  table access by index rowid| test     |    1 |    48 |    2         (0)| 00:00:01 |

|*  2 |   index rangescan            | idx_test |     1 |      |    1         (0)| 00:00:01 |

predicate information (identified by operation id):

2 -access("c1"='1' and "c3"='3')                         我們可以看到,對優化器來說,這兩種查詢對它來說是沒有區別的。

filter("c3"='3')

復合索引在什麼情況下使用

1 復合索引使用的目的是什麼?能形成索引覆蓋,提高where語句的查詢效率 2 乙個復合索引是否可以代替多個單一索引?復合索引的使用原則是第乙個條件應該是復合索引的第一列,依次類推,否則復合索引不會被使用 所以,正常情況下復合索引不能替代多個單一索引 3 在進行哪些型別的查詢時,使用復合索引會比較有...

MySQL索引在什麼情況下會失效

索引的失效,會大大降低sql的執行效率,日常中又有哪些常見的情況會導致索引失效?對查詢進行優化,應盡量避免全表掃瞄,首先應考慮在 where 及 order by 涉及的列上建立索引。應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如 sele...

layoutSubviews在什麼情況下呼叫

1.在以下情況都會呼叫 注意 當view的size的值為0的時候,addsubview也不會呼叫layoutsubviews。當要給這個view新增子控制項的時候不管他的size有沒有值都會呼叫 2.先來看一下uiview的layoutsubviews在什麼情況下會呼叫 subview view s...