結(jié)合阿里阿里巴巴Java開發(fā)手冊,結(jié)合自己的經(jīng)驗,對于sql優(yōu)化有下面幾點體會
- 在應(yīng)用系統(tǒng)開發(fā)初期,由于開發(fā)數(shù)據(jù)庫數(shù)據(jù)比較少,對于查詢SQL語句,復(fù)雜視圖的的編寫等體會不出SQL語句各種寫法的性能優(yōu)劣,但是如果將應(yīng)用系統(tǒng)提交實際應(yīng)用后,隨著數(shù)據(jù)庫中數(shù)據(jù)的增加,系統(tǒng)的響應(yīng)速度就成為目前系統(tǒng)需要解決的最主要的問題之一。
建表規(guī)約
- 適當(dāng)?shù)拇笮∫?guī)約(mysql小寫;oracle大寫)
- mysql在windows不區(qū)分大小寫;但在Linux默認(rèn)大小寫;
- 禁止用保留子字,表的命名最好是“業(yè)務(wù)名稱——表的作用”
- 合適的字符存儲長度(不但節(jié)約庫表空間,節(jié)約索引空間,提升檢索效率)
- 人的年齡:1-150(255,tinyint:1);龜?shù)臍q數(shù):數(shù)百歲(65535,smalInt:2)
-* 恐龍化石:0-數(shù)千年(ungigned int:4);太陽:50億年(unsigned bigint:)
- 在多數(shù)情況下,Oracle使用索引來更快地遍歷表,優(yōu)化器主要根據(jù)定義的索引來提高性能。但是,如果在SQL語句的where子句中寫的SQL代碼不合理,就會造成優(yōu)化器刪去索引而使用全表掃描,一般就這種SQL語句就是所謂的劣質(zhì)SQL語句。
索引規(guī)約
- 業(yè)務(wù)上具有唯一特性的字段,必須建立索引(可能為空,空值沒有索引);
- 在varchar字段上建立索引的時候,必須指定索引的長度;沒必要進(jìn)行全字段索引;(length:20;90%)
- 禁止使用左模糊或者全模糊查詢,如果需要請走搜索引擎; 索引文件具有B-tree的最左前綴匹配特性;
- Select t.username from user where t.username like ‘c%'
- 利用延遲管理或者子查詢優(yōu)化超多分頁場景
- 先快速定位需要獲取的id段,然后在進(jìn)行關(guān)聯(lián)
- 建立組合索引的時候,區(qū)分度最高的在最左邊
- Select t.username from user where t.id = ’t’ and t.gender = ‘female'
- 避免對索引字段進(jìn)行計算操作
- 避免在索引字段上使用not,<>,!=
- 避免在索引列上使用IS NULL和IS NOT NULL
- 避免在索引字段上使用函數(shù)
- 避免建立索引的列中使用空值。
- 如果檢索數(shù)據(jù)量超過30%的表中記錄數(shù).使用索引將沒有顯著的效率提高.
- 在特定情況下, 使用索引也許會比全表掃描慢, 但這是同一個數(shù)量級上的區(qū)別. 而通常情況下,使用索引比全表掃描要塊幾倍乃至幾千倍!
SQL 其他基本語句
- 不要count(列)來替換count(*);count(null)=0
- 使用isNuLL()來判斷是否為NULL值
- null和任何值比較都為NULL;null<>null為null.而不是fasle;
- null=null返回為null;而不是false; null<>1返回為NULL,而不是true
- 盡量使用 a is not null 改為 a>0 或a>’’
- 不得使用外鍵與級聯(lián),一切外健概念必須在應(yīng)用層解決;
- 外健與級聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式,高并發(fā)集群;級聯(lián)更新是強阻塞,存在于數(shù)據(jù)庫更新風(fēng)暴的風(fēng)險,外健影響數(shù)據(jù)庫插入的速度;
- 禁止使用存儲過程,存儲過程難以調(diào)試和擴(kuò)展,更沒有移植性;
- 禁止用union
- 使用 > 及 < 操作符(大于或小于操作符)時,利用>=;
SQL 語句幾句忠告:
- 1: 合理使用索引
- 2: 只查詢你需要的列信息
- 3: 盡量避免數(shù)據(jù)左邊的函數(shù)運算
- 4: 盡量避免相關(guān)子查詢(在百萬級別的時候,發(fā)現(xiàn)left join,inner join的效率會更高)
- 5: 避免在LIKE模式開始時的通配符
參考地址:
http://www.vertabelo.com/blog/technical-articles/5-tips-to-optimize-your-sql-queries
《碼出高效-阿里巴巴Java開發(fā)手冊》終極版