摘要:本文介紹宜信105條數據庫軍規,幫助研發團隊評估數據庫開發質量,達到儘早發現問題解決問題的目標。sql
做爲一家金融科技企業,宜信的大量業務都依賴於數據庫。如何提升公司總體數據庫應用水平,是對DBA的一大挑戰,也很是具備現實意義。筆者在宜信的多年工做中,與團隊一塊兒總結整理了針對傳統關係型數據庫的使用規則,並藉助自研的數據庫審覈平臺落地,藉此幫助研發團隊評估數據庫開發質量,達到儘早發現問題、解決問題之目的。下圖正是這一系統的簡單原理圖。數據庫
如上圖所示,針對規則部分又可細分爲以下分類(部分)。簡單描述以下,後面將逐一詳細說明。緩存
【規則1】併發
規則說明:超過指定規模且沒有分區的表。函數
規則閾值:2GB(物理大小超過指定閥值)。性能
規則描述:表的規模過大,將影響表的訪問效率、增長維護成本等。常見的解決方案就是使用分區表,將大表轉換爲分區表。優化
【規則2】spa
規則說明:單表或單分區記錄數量過大。設計
規則閾值:1000000(單表或單分區記錄數超過指定閥值)。對象
規則描述:控制單個表或單個分區的數據規模,提升單一對象的訪問效率。如記錄數過多,應考慮分庫、分表、分區等策略。
【規則3】
規則說明:大表過多。
規則閾值:自定義(超過2G的表的數量過多)。
規則描述:大表在全部表中所佔比例超過20%(OLTP)或95%(OLAP)。
【規則4】
規則說明:單表分區數量過多。
規則閾值:500(單表分區數量超過指定閥值)。
規則描述:分區表中分區數量過多,將致使總體維護成本太高,可調整分區粒度。
【規則5】
規則說明:分區表數量過多。
規則閾值:2000(分區表數量超過指定閥值)。
規則描述:分區表過多,常見緣由是大表較多。因根據需求,考慮進行垂直拆分,減少單庫規模。
【規則6】
規則說明:複合分區數量過多。
規則閾值:5(複合分區數量超過指定閥值)。
規則描述:同上面分區表數量過多理由相似(含有複合分區表的數量)。
【規則7】
規則說明:存在啓用並行屬性的表。
規則閾值:1(表degree屬性不爲1)。
規則描述:通常狀況下不建議對錶設置並行屬性。
【規則8】
規則說明:外鍵沒有索引的表。
規則描述:外鍵沒有索引會致使主子表關聯查詢時,關聯效率很低。
【規則9】
規則說明:組合索引數量過多或沒有索引。
規則描述:組合索引過多,將致使空間消耗較大、索引維護成本較高。應考慮構建戰略性索引結構,不要針對每一個需求都經過建立索引解決。
【規則10】
規則說明:單表索引數量過多。
規則閾值:3(單表索引數量超過指定閥值)。
規則描述:索引能夠提升訪問速度,但數量過多將致使空間消耗過大,且索引維護成本較高,影響DML效率等問題。應控制索引數量。
【規則11】
規則說明:存在7天內沒有使用的索引。
規則描述:在數據庫一段時間內,該索引沒有被任何SQL語句使用。請評估此索引的有效性。
【規則12】
規則說明:字段重複索引。
規則描述:一個字段被多個索引引用,請考慮構建策略,刪除沒必要要的索引。
【規則13】
規則說明:存在全局分區索引。
規則描述:全局分區索引,存在維護成本較高問題。當分區發生變化時,須要維護全局索引的有效性。
【規則14】
規則說明:失效索引。
規則描述:索引狀態爲INVALID、UNUSABLE。
【規則15】
規則說明:索引高度超過指定高度。
規則閾值:4。
規則描述:索引高度太高致使增長IO成本。
【規則16】
規則說明:存在位圖索引。
規則描述:OLTP環境中不建議使用位圖索引,若是表對象經查作DML操做,會在必定程度上阻塞相關操做。
【規則17】
規則說明:存在函數索引。
【規則18】
規則說明:存在啓用並行屬性的索引。
規則閾值:1(索引degree屬性不爲1)。
規則描述:通常狀況下不建議對索引設置並行屬性。
【規則19】
規則說明:存在聚簇因子過大的索引。
規則閾值:自定義。
規則描述:聚簇因子過大的索引,應該考慮優化。
【規則20】
規則類別:約束。
規則說明:沒有主鍵的表。
規則描述:主鍵是關係型數據庫中惟一肯定一條記錄的依據,沒有任何理由不定義主鍵。
【規則21】
規則類別:約束。
規則說明:使用外鍵的表。
規則描述:不建議使用外鍵約束,數據一致性經過應用端解決。
【規則22】
規則說明:表字段過多。
規則閾值:100(字段數量超過指定閥值)。
規則描述:字段過多,會致使記錄長度過大。單個數據存儲單元將保存的記錄數過少,影響訪問效率。
【規則23】
規則說明:包含有大字段類型的表。
規則描述:大對象字段是關係型數據庫中應儘可能避免的。若有須要,可考慮在外部進行存儲。
【規則24】
規則說明:記錄長度定義過長。
規則描述:記錄定義長度與實際存儲長度差別過大,請考慮字段類型定義是否合理,個別字段過長是否可分表存儲。
【規則25】
規則說明:不包含時間戳字段的表。
規則描述:時間戳,是獲取增量數據的一種方法。建議在表內增長建立時間、更新時間的時間戳字段。命名方式爲CREATE_TIME、UPDATE_TIME。
【規則26】
規則說明:表字段類型不匹配。
規則描述:此規則會抽樣部分數據,分析其定義類型與存儲類型是否相符。常見問題如用數字、文本保存日期等。
【規則27】
規則說明:緩存太小的序列。
規則閾值:100(序列cache值小於指定閥值)。
規則描述:系統默認會緩存20,如太小將致使頻繁查詢數據字典,影響併發能力。
【規則28】
規則說明:存在存儲過程及函數度。
規則閾值:20(存儲過程和函數的數量超過指定閥值)。
規則描述:存儲過程及函數,將影響數據庫的異構遷移能力,並存在代碼維護性較差等緣由。
【規則29】
規則說明:存在觸發器。
規則閾值:20(觸發器數量超過指定閥值)。
規則描述:觸發器,將影響數據庫的異構遷移能力。若有數據一致性維護需求,請從應用端給予考慮。
【規則30】
規則說明:存在DBLINK。
規則描述:不建議在一個數據庫中訪問其餘數據庫,請考慮在應用端解決。
【規則31】
規則說明:未使用綁定變量。
規則閾值:自定義(執行次數)。
規則描述:執行次數超過必定閥值的語句,謂詞右側存在常量值。
【規則32】
規則說明:綁定變量的數量過多。
規則閾值:自定義(綁定變量的個數)。
規則描述:綁定變量數量過多會增長變量替換時間,在必定程度上增長sql執行時間。
【規則33】
規則說明:笛卡爾積。
規則描述:缺乏鏈接條件,致使表間關聯使用了笛卡爾積的鏈接方式,執行計劃中包含"CARTESIAN|"字樣。
【規則34】
規則說明:嵌套循環層次過深。
規則閾值:自定義(層次數)。
規則描述:嵌套循環層次過深,超過指定閥值。執行計劃中嵌套多層"NESTED LOOP"或"FILTER"字樣。
【規則35】
規則說明:嵌套循環內層表訪問方式爲全表掃描。
規則描述:嵌套循環的內層表訪問方式爲全表掃描,效率很低。
【規則36】
規則說明:排序合併鏈接中存在大結果集排序。
規則描述:排序合併中兩個結果集都要排序,應調整爲其餘鏈接方式。
【規則37】
規則說明:多表關聯。
規則閾值:自定義(表個數)。
規則描述:過多的表關聯,影響性能。
【規則38】
規則說明:大表全表掃描。
規則閾值:自定義(表大小,單位GB)。
規則描述:對大表執行了全表掃描操做,執行計劃中包含"TABLE ACCESS FULL"字樣。
【規則39】
規則說明:大索引全掃描。
規則閾值:自定義(索引大小,單位GB)。
規則描述:對大索引執行了索引全掃描操做,執行計劃中包含"INDEX FULL SCAN"字樣。
【規則40】
規則說明:大索引快速全掃描。
規則閾值:自定義(索引大小,單位GB)。
規則描述:對大索引執行了索引快速全掃描操做,執行計劃中包含"INDEX FAST FULL SCAN"字樣。
【規則41】
規則說明:索引跳躍掃描。
規則描述:對索引執行跳躍掃描操做,執行計劃中包含"INDEX SKIP SCAN"字樣。
【規則42】
規則說明:分區全掃描。
規則描述:對分區表進行了全分區掃描,執行計劃中含有「PARTITION RANGE ALL」字樣。
【規則43】
規則說明:非連續分區掃描。
規則描述:非連續分區掃描,執行計劃中含有「PARTITION RANGE INLIST」或「PARTITION RANGE OR」字樣。
【規則44】
規則說明:跨分區掃描。
規則描述:連續的分區掃描,執行計劃中含有「PARTITION RANGE ITERATOR」字樣。
【規則45】
規則說明:存在隱式轉換。
規則描述:在條件判斷中使用了隱式數據類型轉換。
【規則46】
規則說明:存在大結果集排序操做。
規則描述:可考慮經過引入索引等操做避免排序。
【規則47】
規則說明:存在並行訪問特徵。
規則描述:並行很影響性能,通常狀況下須要避免。
【規則48】
規則說明:存在視圖訪問。
規則描述:視圖操做通常能夠合併、解嵌套等,如都不行應該排查視圖定義。
【規則49】
規則說明:掃描塊數與返回記錄數比例太低。
規則閾值:自定義(百分比)。
規則描述:掃描大量數據但返回記錄數不多,須要從邏輯上調整SQL語句。
【規則50】
規則說明:子游標過多。
規則閾值:自定義(子游標數)。
規則描述:子游標過多,可能存在執行計劃不穩定的狀況。
【規則51】
規則說明:elapsed_time。
規則閾值:自定義。
【規則52】
規則說明:cpu_time
規則閾值:自定義
【規則53】
規則說明:buffer_gets
規則閾值:自定義
【規則54】
規則說明:disk_reads
規則閾值:自定義
【規則55】
規則說明:direct_writes
規則閾值:自定義
【規則56】
規則說明:executions
規則閾值:自定義
【規則57】
規則說明:超過指定規模且沒有分區的表。
規則閾值:自定義(表大小,GB)。
規則描述:表的規模過大,將影響表的訪問效率、增長維護成本等。常見的解決方案就是使用分區表,將大表轉換爲分區表。
【規則58】
規則說明:單庫數據表過多。
規則閾值:自定義(表個數)。
規則描述:單庫數據表過多,將影響總體性能。必要時,進行業務邏輯的垂直拆分。
【規則59】
規則說明:單表(分區)數據量過大。
規則閾值:自定義(數據規模,記錄數)。
規則描述:單表(分區)數據表過多,將影響總體性能。必要時,進行分庫、分表或按期清理、歸檔數據。
【規則60】
規則說明:單表索引數量過多。
規則閾值:自定義(索引數量)。
規則描述:單表索引數量過多,不只維護成本高,並且佔用更多的空間。
【規則61】
規則說明:存在重複索引。
規則描述:索引能由另外一個包含該前綴的索引徹底代替,是多餘索引。多餘的索引會浪費存儲空間,並影響數據更新性能。
【規則62】
規則說明:索引選擇率不高。
規則閾值:自定義(選擇率,百分比)。
規則描述:索引選擇率不高,將致使索引低效,請調整索引字段。
【規則63】
規則說明:表存在外鍵。
規則描述:外鍵資源將消耗數據庫的計算能力,建議經過應用層保證數據約束。
【規則64】
規則說明:表沒有定義主鍵。
規則描述:沒有定義主鍵,MySQL會自動建立主鍵。這不是一種好的設計方法。
【規則65】
規則說明:存在大對象字段。
規則描述:大對象字段將影響存取性能、耗費較多空間,建議在數據庫以外存儲。
【規則66】
規則說明:單表字段數過多。
規則閾值:自定義(字段數)。
規則描述:表字段數過多,將形成記錄過長,單頁存儲記錄數減小。可考慮拆表處理。
【規則67】
規則說明:單表字段定義長度過長。
規則閾值:自定義(字段長度,單位字節)。
規則描述:應控制單表定義長度,避免過長記錄。
【規則68】
規則說明:單表主鍵字段定義長度過長。
規則閾值:自定義(字段長度,單位字節)。
規則描述:應控制主鍵字段長度,過長的主鍵字段會形成索引空間消耗過大。
【規則69】
規則說明:表沒有定義時間戳字段。
規則描述:時間戳字段是獲取增量數據的最佳方法,請爲表定義時間戳字段。
【規則70】
規則說明:字段數據類型定義錯誤。
規則閾值:自定義(記錄數)。
規則描述:根據字段保存內容判斷,字段類型定義異常,建議選擇適合的數據類型。
【規則71】
規則說明:單表存在函數、存儲過程、觸發器。
規則描述:存儲過程、函數、觸發器等都將消耗數據庫的計算能力,建議經過應用層保證數據約束。
【規則72】
規則說明:大表全表掃描。
規則閾值:自定義(表大小,單位GB)。
規則描述:對大表執行了全表掃描操做。
【規則73】
規則說明:DEPENDENT UNION
【規則74】
規則說明:SUBQUERY
【規則75】
規則說明:DEPENDENT SUBQUERY
【規則76】
規則說明:MATERIALIZED
【規則77】
規則說明:UNCACHEABLE SUBQUERY
【規則78】
規則說明:UNCACHEABLE UNION
【規則79】
規則說明:fulltext
【規則80】
規則說明:index_merge
【規則81】
規則說明:unique_subquery
【規則82】
規則說明:all
【規則83】
規則說明:index range
【規則84】
規則說明:使用臨時表。
規則描述:執行過程當中使用了臨時表,執行計劃中包括"using temporary"。
【規則85】
規則說明:使用磁盤排序。
規則描述:執行計劃中使用了磁盤排序,執行計劃中包含"using filesort"字樣。
【規則86】
規則說明:index_ratio
【規則87】
規則說明:lock_time_sum
【規則88】
規則說明:select *
規則描述:禁止使用select *,必須明確選擇所需的列。
【規則89】
規則說明:重複查詢子句。
規則描述:禁止使用重複的查詢子句,應使用with as替換子句(僅限Oracle)來提高SQL執行效率。
【規則90】
規則說明:查詢字段引用函數。
規則描述:禁止在查詢字段中引用函數(類型轉換函數、函數索引狀況可忽略)。
【規則91】
規則說明:嵌套select子句。
規則描述:禁止出現select子句的嵌套子查詢,避免出現性能問題。
【規則92】
規則說明:出現union。
規則描述:防止出現沒必要要的排序動做。
【規則93】
規則說明:多個過濾條件經過or鏈接。
規則描述:防止優化器出現選擇異常。
【規則94】
規則說明:謂詞條件使用like '%xxx'
規則描述:沒法使用索引。
【規則95】
規則說明:謂詞中存在負向操做符。
規則描述:!=,<>,!<,!>,not exists,not。
【規則96】
規則說明:存在子查詢狀況。
規則描述:這個要區分位置(select、from、where、having等部分)。
【規則97】
規則說明:存在三個以上的表關聯。
【規則98】
規則說明:存在全鏈接或外鏈接。
規則描述:cross join或outer join狀況。
【規則99】
規則說明:update中出現order by子句。
規則描述:防止更新過程當中出現沒必要要的排序。
【規則100】
規則說明:update中必須出現where子句。
規則描述:防止出現意外的所有更新動做。
【規則101】
規則說明:更新主鍵。
規則描述:禁止出現更新主鍵的狀況。
【規則102】
規則說明:delete中出現order by子句。
規則描述:防止刪除過程出現沒必要要的排序。
【規則103】
規則說明:delete中必須出現where子句。
規則描述:防止出現意外的所有刪除動做。
【規則104】
規則說明:新增SQL文本過長規則。
【規則105】
規則說明:新增IN List元素過多。
做者:韓鋒首發於做者我的公號《韓鋒頻道》。
來源:宜信技術學院