2009-07-20 130 views

回答

15

存儲過程會給你一個小的性能提升,但主要是它們用於做一個簡單的查詢很難或不可能完成的任務。存儲過程對於簡化許多不同類型客戶端的數據訪問非常有用。數據庫管理員喜歡它們是因爲它們控制數據庫的使用方式,而不是將這些細節留給開發人員。

尋找索引和適當的表設計以獲得更好的性能。

2

在MySQL或任何其他SQL服務器(如MSSQL或Oracle)中,存儲過程大大提高了所涉及查詢的速度,因爲這已經被編譯。存儲過程比直接查詢更安全,並且作爲數據庫中的對象可以由所有者管理,從而爲每個用戶提供正確的訪問權限。

使用存儲過程,您還可以隱藏查詢和過程的邏輯,並向開發團隊和其他程序員提供一個「黑匣子」,以便插入參數並接收結果。

明確存儲過程的岩石!

從MySQL 5.1文檔: 存儲程序可以在某些情況下特別有用:

當多個客戶端應用程序是用不同的語言或工作在不同的平臺,但需要執行相同的數據庫操作。

安全性至關重要。例如,銀行爲所有常見操作使用存儲過程和函數。這提供了一致且安全的環境,並且例程可以確保每個操作都被正確記錄。在這樣的設置中,應用程序和用戶將不能直接訪問數據庫表,但只能執行特定的存儲例程。

存儲的例程可以提供改進的性能,因爲需要在服務器和客戶端之間發送較少的信息。折中的原因是這會增加數據庫服務器上的負載,因爲更多的工作是在服務器端完成的,而在客戶端(應用程序)端則更少。如果許多客戶機(如Web服務器)僅由一個或幾個數據庫服務器提供服務,請考慮這一點。

存儲的例程還允許您在數據庫服務器中擁有函數庫。這是現代應用程序語言共享的一項功能,它允許在內部進行此類設計(例如,通過使用類)。即使在數據庫使用範圍之外,使用這些客戶端應用程序語言功能對程序員也是有益的。

+0

MySQL在編譯存儲過程之前在現有版本的已建立會話中執行它們之前 – 2013-01-17 00:59:42

2

嚴重簡化 - 存儲過程性能等於或稍微優於代碼,其代價是數據庫服務器負載。由於大多數數據庫系統都關心多用戶訪問,並且正在使用數據庫服務器的商品硬件,所以使用卸載數據庫服務器的代碼可能會贏得整體。對於高端數據庫服務器,> 4個內核,> 32gb ram,SP加載通常不是問題。

存儲程序;

  1. 傳遞查詢數據較少 - 井編寫的代碼
  2. 最小速度提高解析&緩存爲「稍好」 - 最小速度以及編寫的代碼
  3. 移動執行加載到數據庫服務器改進與客戶端(網絡服務器)相比,可能將負載分散到許多系統中。 - 速度的提高很大程度上取決於實際的代碼和數據量,包括傳輸的「超額」數據。相當多的代碼傳輸比實際使用的數據更多的數據(db庫,寫得不好的查詢,select *等)

不要早期優化。

存儲過程比速度有許多其他好處,列表中的安全性很高。 SP和代碼等使用的測試和分析框架..

學習會 -

在一個單一的編程環境,效益可通過SP編程的學習曲線,SP測試框架,版本控制的多種方法抵銷明確回答此問題,並指導您爲應用程序提供更好的「性能」,而不僅僅是選擇SP或即席查詢。

回答「是否值得」 - 如果您沒有測試/分析框架,那麼您只能猜測。基於我的代碼和硬件的任何答案都可能與您的無關。

我在使用數據庫(Sybase,Oracle,MS SQL,MySQL,Postgres)存儲過程的許多Perl/TCL/PHP/C Web應用程序方面的實際經驗不會大大提高性能。但我仍然經常使用它們,只是出於其他原因而不是表現。它們可以極大地改進特定的複雜查詢,但這很少是代碼的大部分和總體處理時間。

8

Yikes我討厭別人讀這些答案,並得到錯誤的印象。在「MySQL」與「SQL server/Oracle」上的「Stored Whatever」實現之間存在一些非常重要的差異。

參見:http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/

,詢問這個問題,每個人都承擔一些關於MySQL的 存儲過程的執行情況;他們錯誤地認爲存儲的 過程被編譯並存儲在與Microsoft SQL Server [1]或Oracle [2]中的存儲過程高速緩存類似的全局存儲過程高速緩存 中。

這是錯誤的。平展不正確。

這是事實:與MySQL服務器 的每個單一連接都維護着自己的存儲過程高速緩存。

花一點時間閱讀文章的其餘部分和評論。這很短,你會對這些問題有更好的理解。