1.
索引必須合理建立,過多的建立索引會增加增刪改的負擔。
2.有空值的字段盡量不要建索引。 3.
盡可能建立唯一的索引。 4.
常用的字段組合可以建立復合索引。 5.
不要在索引列使用以下操作,否則索引會失效。 a
.not
、<>
b. is null ,isnot null
c.like
,like
比較特殊,當使用
like '%xx%'
時,索引會失效;左模糊和右模糊索引都可以用,當然,右模糊時需要建立對應的倒索引。
比如:zte_fbp_employees_n3是表ztenet.zte_fbp_employees
的在employee_number列上的索引
———————————不走n3
索引————————————————————
not:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
not in(
'000');
is not null:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
is not null;
is null:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
is null;
like:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
like '%001%';
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
like '%001';
——————————走n3
索引————————————————————
is not null:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number>'';
like:
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_numberlike '001%';
//建立乙個反的索引
,然後左
like
create
index user_info_idx on user_info(upper(reverse(full_id)));
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number
like '%001'; 6.
不要在索引列執行計算、型別轉換,否則索引會失效,反之,有時我們會故意讓索引失效,這時我們就可以通過在索引列計算、型別轉換等等方式來實現。
比如:bill_code是表zte_ets_air_bills的索引
——————————不走n1
索引———————————————————— //
通過計算,取消不需要的索引
select*
from zte_ets_air_bills t
where t.bill_code
||''
= '000'
and t.bill_id = 1
//轉換讓其不走索引
select*
from zte_ets_air_bills t
where
nvl(
t.bill_code
,'n')
= '000'
and t.bill_id = 1
注意:列和對應值的型別一定要寫對,否則可能導致不走索引
此時走的是列名determiner 的索引
n2,因為n2是
varchar
select*
from ztefbp.zte_fbp_pos_stru_elements el
where 1 = 1
and el.determiner = '0'
and el.pos_structure_id = 10001
若寫成如下,則不會走索引
n2了,因為
demerminer
=0這句預設轉換成了
to_number(
demerminer
)=0,
索引失效了。
select*
from ztefbp.zte_fbp_pos_stru_elements el
where 1 = 1
and el.determiner = 0
and el.pos_structure_id = 10001
7.如果是組合索引,條件只用到乙個列,這時可以把另外乙個列用於乙個客觀條件,
比如:zte_fbp_employees_n1是由dept_id和employee_number組成的索引
——————————不走n1
索引————————————————————
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number = '000'
——————————走
n1索引—————————————————————————
selectt.employee_id
from ztenet.zte_fbp_employees t
where t.employee_number = '000'
and
t.dept_id
>=0
8.不是走索引就一定快,優化時根據實際情況來進行選擇。
效能優化之mysql索引優化
sql及索引優化 如何通過慢查詢日誌發現有問題的sql?查詢次數多且每次查詢占用時間長的sql 通常為pt query digest分析的前幾個查詢 io大的sql 注意pt query digest分析中的rows examine項 未命中索引的sql 注意pt query digest分析中ro...
SQL優化之索引使用
最近找工作,遇到乙個面試題 sql哪些關鍵字會忽略索引?因為之前沒這方面的經驗,當時懵逼了,隨便扯了一點。最終有沒能通過面試很遺憾。我們都知道對查詢進行優化,應盡量避免全表掃瞄,多使用索引,首先應考慮在 where 及 order by 涉及的列上建立索引。不過應該注意兩點 1 並不是所有索引對查詢...
MySQL 資料庫效能優化之索引優化
資料庫效能優化專題 系列的第三篇文章 mysql 資料庫效能優化之索引優化 大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面...