SQL 優(yōu)化的幾點經(jīng)驗

結(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ā)手冊》終極版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容