1. 程式人生 > >Sql的一些優化經驗

Sql的一些優化經驗

Sql的一些優化經驗

Sql的一些優化經驗

1.like模糊匹配

a、取消like,用具體的值。
b、根據like先建立一個臨時表,然後通過臨時表關聯查詢。
c、多級巢狀的查詢或者更新,可以拆成多步、或者用臨時表

2.索引欄位

不要在建立的索引的資料列上進行下列操作:
◆避免對索引欄位進行計算操作
◆避免在索引欄位上使用not,<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出現數據型別轉換
◆避免在索引欄位上使用函式
◆避免建立索引的列中使用空值。

最主要的:
1. 在建立表時,要充分考慮這個表以後查詢時可能用到的常用欄位,並建立索引
2. 建立索引時,要避免選擇欄位中的值為重複的
如:sex欄位有隻有兩個型別:男女,如果在這個欄位上建立索引,其實是沒有意義的。
3. 建立索引時,要避免選擇欄位中的值出現null的情況

3.where欄位

a、避免在索引欄位上使用函式,如:
where createDate>=to_date(#{date})

b、儘量使用 exist 和not exist代替 in和not in

exists做為where 條件時,是先對where 前的主查詢詢進行查詢,
然後用主查詢的結果一個一個的代入exists的查詢進行判斷,
如果為真則輸出當前這一條主查詢的結果,否則不輸出
  • exist會針對子查詢的表使用索引.
  • not exist會對主子查詢都會使用索引.
  • in與子查詢一起使用的時候,只能針對主查詢使用索引.
  • not in則不會使用任何索引. 注意,一直以來認為exists比in效率高的說法是不準確的。
  • in 是把外表和內表作hash 連線,而exists是對外表作loop迴圈,每次loop迴圈再對內表進行查詢。
  • 如果查詢的兩個表大小相當,那麼用in和exists差別不大。
  • 如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in
  • 外大內小用in效率極低,用exists效率很高
  • 外小內大時使用in比exists效率更高
  • exits適合內小外大的查詢,in適合內大外小的查詢

例如:表A(小表),表B(大表)
1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
2:相反的 select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。

  • 如果查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;
  • 而not extsts 的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in要快。
4.傳遞引數時

不要以字元格式宣告數字,要以數字格式宣告字元值。如:

SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
--不要使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369’

在這裡插入圖片描述