1、SELECT子句中避免使用 *, 盡量應該根據業務需求按欄位進行查詢
2、盡量多使用COMMIT如對大資料量的分段批量提交釋放了資源,減輕了服務器壓力
3、在寫sql陳述句的話,盡量保持每次查詢的sql陳述句欄位用大寫,因為oracle總是先決議 sql陳述句,把小寫的字母轉換成大寫的再執行
4、用UNION-ALL 替換UNION,因為UNION-ALL不會過濾重復資料,所執行效率 要快于UNION,并且UNION可以自動排序,而UNION-ALL不會
5、避免在索引列上使用計算和函式,這樣索引就不能使用
Sql優化精簡版:
1.(重點)(必須說) SELECT陳述句中避免使用 ,
盡量應該根據業務需求按欄位進行查詢
舉例:如果表中有個欄位用的是clob或者是blob這種大資料欄位的話,
他們的查詢應該根據業務需要來進行指定欄位的查詢,切記勿直接用
2.(重點) 洗掉重復記錄(oracle):
最高效的洗掉重復記錄方法 ( 因為使用了ROWID)例子:
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
3. 用>=替換>
如一個表有100萬記錄,一個數值型欄位A,
A=0時,有30萬條;
A=1時,有30萬條;
A=2時,有39萬條;
A=3時,有1萬記錄,
那么執行 A>2 與 A>=3 的效果就有很大的區別了,因為 A>2 時,
ORACLE會先找出為2的記錄索引再進行比較,
而A>=3時ORACLE則直接找到=3的記錄索引,
4.(重點)盡量多使用COMMIT
如對大資料量的分段批量提交
5. (重點)用NOT EXISTS 或(外連接+判斷為空)方案 替換 NOT IN運算子
此操作是強列推薦不使用的,因為它不能應用表的索引,
推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替
6.(重點 必須說)LIKE運算子(大資料的全文檢索使用luncene)(solr)
因為使用like不當,會導致性能問題,原因是like在左右兩邊都有
%的時候,不會使用索引,
如LIKE ‘%5400%’ 這種查詢不會參考索引,
而LIKE ‘X5400%’ 則會參考范圍索引,
一個實際例子:
查詢營業編號 YY_BH LIKE ‘%5400%’ 這個條件會產生全表掃描,
如果改成 YY_BH LIKE ‘X5400%’ OR YY_BH LIKE ‘B5400%’
則會利用 YY_BH 的索引進行兩個范圍的查詢,性能肯定大大提高,
7.(重點,必須說)避免在索引列上使用計算和函式,這樣索引就不能使用
舉例:
低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT … FROM DEPT WHERE SAL > 25000/12;
8.(重點 必須說)用UNION-ALL 替換UNION,
因為UNION-ALL不會過濾重復資料而且不會自動排序,
所執行效率要快于UNION,
9. (優化,重點,3個方面 a.快取 b.分段批量 c.存盤程序)減少訪問資料庫的次數
舉例:如果批量洗掉多條資料,可以用 delete from tableName where id in (1,2,3)
而不要用多條delete陳述句進行洗掉
10.(重點 必須說)用TRUNCATE替代DELETE
TRUNCATE不記錄日志,DELETE記錄日志,所以TRUNCATE要快于DELETE但是一旦用TRUNCATE進行洗掉就不能進行恢復,TRUNCATE是洗掉整張表的資料不能加where條件,
mysql,sqlserver中如果id為自增型別,那么如果用TRUNCATE洗掉,則id欄位再插入資料時從1開始,如果delete洗掉的話,則從洗掉之前的id的值繼續增長,
四、防sql注入
針對防sql注入,我們通常是這樣做的:
首先在前臺頁面對用戶輸入資訊進行js驗證,對一些特殊字符進行屏蔽,比如:or ,單引號,–,= ,還有就是限制用戶名輸入的長度,我們一般將其限制在6—13位,另外,對于用戶的敏感資訊我們進行Md5加密,還有,為了增加用戶體驗度和用戶友好度,為了不使用戶看到一些詳細的例外資訊我們會進行錯誤資訊頁面的定制,像404,500錯誤,另一個我層面講,這樣做也是為了保護我們的一些重要資訊,此外,我們會給特定的人分配定定的權限,而不是給其分配管理員權限!
sql注入
所謂SQL注入,就是通過一些含有特殊字符的sql陳述句發送到服務器欺騙服務器并進行攻擊,(特殊字符:or, 單引號,–,空格)
Sql注入的防護
1.永遠不要信任用戶的輸入,對用戶的輸入進行校驗,可以通過正則運算式(js正則或者java后臺正則),或限制長度;對單引號和雙"-"進行轉換等,
2.永遠不要使用動態拼裝sql,使用引數化的sql,(永遠不要使用+號拼接sql字串,而是使用?傳參的方式進行)
3.不要給用戶太高的權限而根據需求進行賦權
4.對敏感資訊進行加密 如md5(單向加密不可逆轉),
5.自定義錯誤頁面,目的是為了不把我們的程式的bug暴露在別有用心的人的面前,而去不會讓用戶看到報錯的頁面,也提高了用戶的體驗度,
SQL注入防范
使用引數化的過濾性陳述句
要防御SQL注入,用戶的輸入就絕對不能直接被嵌入到SQL陳述句中,恰恰相反,用戶的輸入必須進行過濾,或者使用引數化的陳述句,引數化的陳述句使用引數而不是將用戶輸入嵌入到陳述句中,在多數情況中,SQL陳述句就得以修正,然后,用戶輸入就被限于一個引數,
資料庫中常用術語:
ddl:資料定義語言 Create Drop Alter
dml:資料操縱語言 insert update delete select
dcl:資料控制語言 grant revoke
tcl:事務控制語言 commit rollback
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287906.html
標籤:其他
上一篇:大資料開發-Go-陣列,切片
