在論壇裡看到有人問,有三個列的復合索引,查詢條件中只包含兩個列是不是就不會走索引了?
經過試驗,我發現兩點:
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...