1.禁止使用select * ,需要哪些字段查哪些字段
2.使用select in ()的時候,如果存在子查詢,使用exist 代替in
應使用:select *
from class_a
where id in ( select id from class_b)
;
3.在明顯不會有重複值的情況下,使用union all 代替 unionselect *
from class_a a
where exists (
select *
from class_b b
where a.id = b.id
);
union 會把兩個結果集的所有資料放到臨時表中後再進行去重操作
union all 不會再對結果集進行去重操作
4.避免使用子查詢,使用join 代替 in
通常子查詢在 in 子句中,且子查詢中為簡單 sql(不包含 union、group by、order by、limit 從句) 時,才可以把子查詢轉化為關聯查詢進行優化。
避免全表掃瞄,新增索引
1.對查詢進行優化,首先在where 和order by 的字段新增索引
2.對同一列進行or判斷時,使用in 代替or
in能使用到索引,or很少能使用到索引
3.where從句盡量避免對欄位進行null判斷
如select id from t where num is null ,會導致索引失效。應該給num欄位設定預設值,如0
4.where從句盡量避免對欄位進行!=或者<>判斷
如select id from t where num != 1,會導致索引失效
5.where 從句中禁止對列進行函式轉換和計算
對列進行函式轉換或計算時會導致無法使用索引
如:where date(create_time)=『20190101』
推薦:where create_time >= 『20190101』 and create_time < 『20190102』
6.避免使用雙%號的查詢條件。
如:a like 『%123%』,(如果無前置%,只有後置%,是可以用到列上的索引的)
7.where 從句使用 left join 或 not exists 來優化 not in 操作
因為 not in 也通常會使用索引失效
8.在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。
sql 優化整理
1.避免無計畫的全表掃瞄 如下情況進行全表掃瞄 該錶無索引 對返回的行無任何限制條件 無where子句 對索引主列 索引的第一列 無限制條件 對索引主列的條件含在表示式中 對索引主列的限制條件是is not null或 對索引主列的限制條件是like操作 且 值是乙個bind variable或 打...
sql優化提速整理
sql優化提速整理 場景描述 在我們實際開發中,隨著業務的不斷增加,資料量也在不斷的攀公升,這樣就離不開乙個問題 資料查詢效率優化 根據自己的以往實際專案工作經驗和學習所知,現在對sql查詢優化做乙個簡單的梳理總結,總結的不好之處,望多多指點交流學習 主要通過以下幾個點來進行總結分析 索引 語句本身...
SQL語句優化技術分析 整理他人的
一 操作符優化 1 in 操作符 用in寫出來的sql的優點是比較容易寫及清晰易懂,這比較適合現代軟體開發的風格。但是用in的sql效能總是比較低的,從oracle執行的步驟來分析用in的sql與不用in的sql有以下區別 oracle試圖將其轉換成多個表的連線,如果轉換不成功則先執行in裡面的子查...