避免索引壓抑

2021-06-26 16:14:56 字數 2837 閱讀 5156

1.1開發正規化1:不要輕易把字段嵌入到表示式

sql> create index emp4_hiredate_ind onemp4(hiredate);

sql> select * from emp4 wherehiredate-7execution plan

plan hash value: 498553951

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

|   0| select statement  |      |   514| 44718 |     3   (0)| 00:00:01 |

|*  1|  table access full| emp4 |   514 | 44718 |     3  (0)| 00:00:01 |

sql> select * from emp4 where hiredateexecution plan

plan hash value: 3424984182

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

|   0| select statement             |                   |    14 | 1218 |     3   (0)| 00:00:01 |

|   1|  table access by index rowid |emp4              |    14 | 1218 |     3   (0)| 00:00:01 |

|*  2|   index range scan           | emp4_hiredate_ind |    14 |      |     2   (0)| 00:00:01 |

總結:字段嵌入到表示式後造成走全表掃瞄而不是索引,降低效率

1.2開發正規化2:減少欄位的轉換

sql> select * from emp4where to_char(hiredate,'yyyy-mm-dd')<'1981-05-01';

execution plan

plan hash value: 498553951

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

|   0 | select statement  |      |     4|   348 |     3  (0)| 00:00:01 |

|*  1 | table access full| emp4 |     4|   348 |     3  (0)| 00:00:01 |

sql> select * from emp4where hiredateexecution plan

plan hash value: 3424984182

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

|   0 | select statement            |                   |     4 |  348 |     3   (0)| 00:00:01 |

|   1|  table access by index rowid| emp4              |     4 |  348 |     3   (0)| 00:00:01 |

|*  2 |  index range scan          |emp4_hiredate_ind |     4 |       |    2   (0)| 00:00:01 |

總結:語句中大量使用轉換函式可能抑制索引使用,從而走全表掃瞄

1.3 開發正規化3:復合索引建在比較固定查詢的某些列

sql>create index emp4_e_j_s on emp4(ename,job,sal);

sql>select ename,job,sal from emp4 where ename='cuug';

500rows selected.

executionplan

planhash value: 1619719520

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

|   0 | select statement     |            |  500 | 13000 |     3   (0)| 00:00:01 |

|*  1 | index fast full scan| emp4_e_j_s |  500 | 13000 |     3   (0)| 00:00:01 |

sql>select * from emp4 where ename='cuug';

executionplan

planhash value: 498553951

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

|   0 | select statement  |     |   500 | 43500 |     3  (0)| 00:00:01 |

|*  1 | table access full| emp4 |   500 |43500 |     3   (0)| 00:00:01 |

避免索引失效

1.全值匹配,對索引中所有列都指定具體值。2.最左字首法則,如果索引有多列,要遵循最左字首法則。指的是查詢從索引的最左前列開始,並且不跳過索引中的列。否者不走索引。3.範圍查詢右邊的列,不走索引,應為mysql底層範圍查詢之後結構就斷了,就無法使用後面得索引了。4.不要在索引列上進行運算操作,索引將...

怎麼避免索引失效

首先在接著 之前,我們先說一下,如何判斷資料庫的索引是否生效!相信大家應該猜到了,就是explain!explain顯示了mysql如何使用索引來處理select語句以及連線表。他可以幫助選擇更好的索引和寫出更優化的查詢語句。例如我們有一張表user,為name列建立索引name index,如下所...

如何避免索引失效

全值匹配 最佳左字首法則 如果索引了多列,要遵守最左字首法則。指得時查詢從索引的最左前列開始並且不跳過索引中的列 不在索引列上左任何操作 計算 函式 自動or手動 型別轉換 因為在索引列上做操作會導致索引失效而轉向全表掃瞄 儲存引擎不能使用索引中範圍條件右邊的列 盡量使用覆蓋索引 只訪問索引的查詢 ...