sql常見語句
一、此處設計的表格含有用戶表,用戶企業關係表,用戶角色關係表,角色表,
角色功能關係表,企業表,功能權限表(目前只是存儲具備權限的,無權限控制的不存儲)
二、sql語句常見優化方式
1:經過變量的方式來設置參數
好:"select * from people p where p.id=?";
壞:"select * from people p where p.id="+id;
數據庫的sql文解析和執行計劃會保存在緩存中,但sql只要變化,就須要從新解析。"where p.id="+id的方式在id值發生變化時須要從新解析,浪費時間。
2:不要使用select*
好:"select people_name ,people_id from people";
壞:"select * from people"
使用select*的話會增長解析的時間,另外還會把不須要的數據查詢出來,數據傳輸也是須要消耗時間的。
3:謹慎使用模糊查詢
好:"select * from people p where p.id like 'param%'";
壞:"select * from people p where p.id like '%param%';
當模糊匹配以%開頭時,該列索引將失效。不以%開頭,該列索引有效。
4:不要使用列號:
好:"select people_name,people_id from people order by people_name";
壞:"select people_name,people_id from people order by 1";
5:優先使用union all 避免使用union
好:"select name from student union all select name from teacher";
壞:"select name from student union select name from teacher";
UNION 由於會將各查詢子集的記錄作比較,故比起UNION ALL ,一般速度都會慢上許多。通常來講,若是使用UNION ALL能知足要求的話,務必使用UNION ALL。還有一種狀況,
若是業務上可以確保不會出現重複記錄
6在where語句或者order by語句中避免對索引字段進行計算操做
好:"select people_name,pepole_age from people where create_date=date1 ";
壞: "select people_name,pepole_age from people where trunc(create_date)=date1";
當在索引列上進行操做以後,索引將會失效。正確作法應該是將值計算好再傳入進來。
7:使用not exist代替not in
好:"select * from orders where customer_name not exist (select customer_name from customer)";
壞: "select * from orders where customer_name not in(select customer_name from customer)";
若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
8:exist和in的區別
in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環再對內表進行查詢。所以,in用到的是外表的索引, exists用到的是內表的索引。
若是查詢的兩個表大小至關,那麼用in和exists差異不大。
若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用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列的索引。
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列的索引。
9:避免在索引列上作以下操做:
◆避免在索引字段上使用<>,!=
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出現數據類型轉換(好比某字段是String類型,參數傳入時是int類型)
當在索引列上使用如上操做時,索引將會失效,形成全表掃描。
10:複雜操做能夠考慮適當拆成幾步
有時候會有經過一個SQL語句來實現複雜業務的例子出現,爲了實現複雜的業務,嵌套多級子查詢。形成SQL性能問題
對於這種狀況能夠考慮拆分SQL,
經過多個SQL語句實現,或者把部分程序能完成的工做交給程序完成。sql