資料型別出現隱式轉換的時候不會命中索引,例如當列型別是字串,一定要將字元常量值用引號引起來。
例如:to_char(日期,'yyyy-mm-dd')='2020-12-10'
改寫為:日期=to_date('2020-12-10','yyyy-mm-dd')
例如:like '%哈哈%' like '%哈哈' 都不會走索引
盡量寫:like '哈哈%'
用or分隔開的條件,如果or前面的條件中,列有索引,而後面的條件中,列沒有索引,那麼涉及到的索引都不會被引用
負向條件包括:!=、、not in、not exists、not like等
復合索引中,查詢條件不包含索引列最左邊部分,即不滿足最左原則,則不會命中符合索引。(最左原則並不是說是查詢條件的順序,而是查詢條件中是否包含索引最左列字段)
範圍條件一般包括:>=、between等。範圍列可以用到索引,但是範圍列後面的列無法用到索引,索引最多用於乙個範圍列,如果查詢條件中有兩個或兩個以上的範圍列則無法全用到索引。
多表連線時,相關條件盡量限制在子查詢裡,並且盡量列出想要的字段,而不是直接連表。限制條件放在on 上,在查詢中不會起到限制作用,左表會全量返回
例如:
--例如
select
a.id,b.name
from table_a a
left join table_b b on a.id=b.id
where a.id=5 and b.name<>'哈哈'
--修改為
select
a.id,b.name
from (
select id from table_a where id=5
) aleft join (
select id,name from table_b where name<>'哈哈'
) b on a.id=b.id
--如果有重複值,在子查詢中也盡量做好去重
少數時候全表掃瞄執行速度快於索引塊的使用(例如小表上的索引)。實際使用中可以根據執行計畫作出相應優化。 SQL優化及索引失效彙總
注意具有索引列的查詢條件,避免造成索引失效 具體看如下的索引失效規則 對於資料重複多的列,無需建立索引 索引並非越多越好,索引越多,對增刪改的速度就會越慢 select 結果中,避免使用 符號,只返回有用的字段 where語句中使用 和 使用 null判斷,例如 where name is null...
SQL索引失效
索引什麼時候不會生效,以下集中情況會導致索引失效 1.條件中用or,即使其中有條件帶索引,也不會使用索引查詢 這就是查詢盡量不要用or的原因,用in吧 注意 使用or,又想索引生效,只能將or條件中的每個列都加上索引 2.對於多列索引,不是使用的第一部分,則不會使用索引。3.like的模糊查詢以 開...
索引失效優化方案
給索引加上函式索引失效 left 3 abc 範圍查詢右側索引失效 emp age,deptid,name 其中deptid 10 不等於失效 deptid 20或者deptid 20 like後首字母 索引失效 like abc 型別不匹配失效 emp.name 123其中name是字串 is n...