1. SQL最佳化的原則是:
將一次操作需要讀取的BLOCK數減到最低,即在最短的時間達到最大的資料吞吐量。
調整不良SQL通常可以從以下幾點切入:
檢查不良的SQL,考慮其寫法是否還有可最佳化內容
檢查子查詢 使用
考慮資料庫的最佳化器
3. 在一個SQL語句中,如果一個where條件過濾的資料庫記錄越多,
4. 查詢時盡可能使用索引覆蓋。即對SELECT的欄位建立複合索引,
6. 使用內層限定原則,在拼字SQL語句時,將查詢條件分解、分類,
7. 應絕對避免在order by子句中使用表達式。
8. 若需要從關聯表讀數據,因此關聯的表一般不要超過7個。
9. 小心使用 IN 與 OR,且需要注意In集合中的資料量。建議集合中的資料不超過200個。
10. 以 來代替,且>以>=代替,
11. 查詢時盡量減少多餘資料的讀取包括多餘的列與多餘的行。
12. 複合索引要注意,例如在建立複合索引時列的順序是F1,F2,F3,
table1的關聯條件) and (table2的等值條件) and (table2的非等值條件)
and (table3與table2的相關條件) and (table3的等值條件關聯條件。
注意:關於多表查詢時from 後表的出現順序對效率的影響仍有待研究。
14. 子查詢問題。對於能用連接方式或視圖方式實現的功能,不要用子查詢。
例如:select name from customer where
customer_ money>1000)。
應使用下列語句取代:select name from customer
inner join where order.money>100。
15. 在WHERE 子句中,避免對列的四則運算,
特別是where 條件的左邊,嚴禁使用運算與函數對列進行處理。
例如有些地方 substring 可用like取代。
16. 如果在語句中有not in(in)操作,
應考慮使用not exists(exists)來重寫,最好的方法是使用外部連接。
17. 對一個業務流程的處理,應該使事物的開始與結束之間的時間間隔越短越好,
原則上做到,資料庫寫入作業在後面完成,避免交叉。
18. 小心不要對過多的列使用列函數和order by,group by等,並謹慎使用disti軟體開發t。
19. 使用union all 取代 union,且資料庫執行union操作,
當已知的業務邏輯決定query A和query B不會重複記錄時,
應以union all取代效率。