58到家數據庫30條軍規,有一條是「禁止使用存儲過程、視圖、觸發器、Event」,數據庫
高併發大數據的互聯網業務,架構設計思路是「解放數據庫CPU,將計算轉移到服務層」,安全
併發量大的狀況下,這些功能極可能將數據庫拖死,業務邏輯放到服務層具有更好的擴展性,可以輕易實現「增機器就加性能」。服務器
數據庫擅長存儲與索引,在目前的互聯網系統架構中,服務器的擴展要比存儲的擴展更簡單,網絡
須要考慮系統可能的瓶頸在服務器仍是數據存儲,存儲過程有它的優勢,應該在開發中合理的選用。架構
存儲過程是一組預先建立並用指定的名稱存儲在數據庫服務器上的 SQL 語句,將使用比較頻繁或者比較複雜的操做,預先用 SQL 語句寫好並存儲起來,之後當須要數據庫提供相同的服務時,只需再次執行該存儲過程。併發
存儲過程是預編譯的,只在建立時進行編譯,之後每次執行存儲過程都不需再從新編譯,而通常 SQL 語句每執行一次就編譯一次,所以使用存儲過程能夠提升數據庫執行速度。函數
存儲過程當中能夠應用條件判斷和遊標等語句,有很強的靈活性,能夠直接調用數據庫的一些內置函數,完成複雜的判斷和較複雜的運算。高併發
複雜的業務邏輯須要多條 SQL 語句,當客戶機和服務器之間的操做不少時,將產生大量的網絡傳輸。若是將這些操做放在一個存儲過程當中,那麼客戶機和服務器之間的網絡傳輸就會減小,下降了網絡負載。性能
(1)數據庫管理人員能夠更好的進行權限控制,存儲過程能夠屏蔽對底層數據庫對象的直接訪問,使用 EXECUTE 權限調用存儲過程,無需擁有訪問底層數據庫對象的顯式權限。大數據
(2)在經過網絡調用過程時,只有對執行過程的調用是可見的。沒法看到表和數據庫對象名稱,不能嵌入SQL 語句,有助於避免 SQL 注入攻擊。
存儲過程不太適合面向對象的設計,沒法採用面向對象的方式將業務邏輯進行封裝,業務邏輯在存儲層實現,增長了業務和存儲的耦合,代碼的可讀性也會下降,
存儲過程的編寫直接依賴於開發人員,若是業務邏輯改動較多,須要頻繁直接操做數據庫,大量業務降維到數據庫,不少異常不能在代碼中捕獲,出現問題較難排查,須要數據庫管理人員的幫助。
過多的使用存儲過程會下降系統的移植性。在對存儲進行相關擴展時,可能會增長一些額外的工做。
架構設計沒有絕對,只有在當前的場景下最合適的。
普通的項目開發中,不建議大量使用存儲過程,對比SQL語句,存儲過程適用於業務邏輯複雜,比較耗時,同時請求量較少的操做,例如後臺大批量查詢、按期更新等。
(1)當一個事務涉及到多個SQL語句時或者涉及到對多個表的操做時能夠考慮應用存儲過程(2)在一個事務的完成須要很複雜的商業邏輯時能夠考慮應用存儲過程(3)比較複雜的統計和彙總能夠考慮應用後臺存儲過程