存儲過程的性能如何?值得使用它們而不是在PHP/MySQL調用中實現複雜的查詢嗎?MySQL存儲過程與複雜查詢
回答
存儲過程會給你一個小的性能提升,但主要是它們用於做一個簡單的查詢很難或不可能完成的任務。存儲過程對於簡化許多不同類型客戶端的數據訪問非常有用。數據庫管理員喜歡它們是因爲它們控制數據庫的使用方式,而不是將這些細節留給開發人員。
尋找索引和適當的表設計以獲得更好的性能。
在MySQL或任何其他SQL服務器(如MSSQL或Oracle)中,存儲過程大大提高了所涉及查詢的速度,因爲這已經被編譯。存儲過程比直接查詢更安全,並且作爲數據庫中的對象可以由所有者管理,從而爲每個用戶提供正確的訪問權限。
使用存儲過程,您還可以隱藏查詢和過程的邏輯,並向開發團隊和其他程序員提供一個「黑匣子」,以便插入參數並接收結果。
明確存儲過程的岩石!
從MySQL 5.1文檔: 存儲程序可以在某些情況下特別有用:
當多個客戶端應用程序是用不同的語言或工作在不同的平臺,但需要執行相同的數據庫操作。
安全性至關重要。例如,銀行爲所有常見操作使用存儲過程和函數。這提供了一致且安全的環境,並且例程可以確保每個操作都被正確記錄。在這樣的設置中,應用程序和用戶將不能直接訪問數據庫表,但只能執行特定的存儲例程。
存儲的例程可以提供改進的性能,因爲需要在服務器和客戶端之間發送較少的信息。折中的原因是這會增加數據庫服務器上的負載,因爲更多的工作是在服務器端完成的,而在客戶端(應用程序)端則更少。如果許多客戶機(如Web服務器)僅由一個或幾個數據庫服務器提供服務,請考慮這一點。
存儲的例程還允許您在數據庫服務器中擁有函數庫。這是現代應用程序語言共享的一項功能,它允許在內部進行此類設計(例如,通過使用類)。即使在數據庫使用範圍之外,使用這些客戶端應用程序語言功能對程序員也是有益的。
正如向我指出在JohnFX的前面的回答禮貌:
「的存儲 程序的性能好處是可疑的,並在 最好的一些閱讀材料最少在這 點:
http://statestreetgang.net/post/2008/04/My-Statement-on-Stored-Procedures.aspx
http://betav.com/blog/billva/2006/05/are_stored_procedures_faster_t.html
享受。
嚴重簡化 - 存儲過程性能等於或稍微優於代碼,其代價是數據庫服務器負載。由於大多數數據庫系統都關心多用戶訪問,並且正在使用數據庫服務器的商品硬件,所以使用卸載數據庫服務器的代碼可能會贏得整體。對於高端數據庫服務器,> 4個內核,> 32gb ram,SP加載通常不是問題。
存儲程序;
- 傳遞查詢數據較少 - 井編寫的代碼
- 最小速度提高解析&緩存爲「稍好」 - 最小速度以及編寫的代碼
- 移動執行加載到數據庫服務器改進與客戶端(網絡服務器)相比,可能將負載分散到許多系統中。 - 速度的提高很大程度上取決於實際的代碼和數據量,包括傳輸的「超額」數據。相當多的代碼傳輸比實際使用的數據更多的數據(db庫,寫得不好的查詢,select *等)
不要早期優化。
存儲過程比速度有許多其他好處,列表中的安全性很高。 SP和代碼等使用的測試和分析框架..
學習會 -
在一個單一的編程環境,效益可通過SP編程的學習曲線,SP測試框架,版本控制的多種方法抵銷明確回答此問題,並指導您爲應用程序提供更好的「性能」,而不僅僅是選擇SP或即席查詢。
回答「是否值得」 - 如果您沒有測試/分析框架,那麼您只能猜測。基於我的代碼和硬件的任何答案都可能與您的無關。
我在使用數據庫(Sybase,Oracle,MS SQL,MySQL,Postgres)存儲過程的許多Perl/TCL/PHP/C Web應用程序方面的實際經驗不會大大提高性能。但我仍然經常使用它們,只是出於其他原因而不是表現。它們可以極大地改進特定的複雜查詢,但這很少是代碼的大部分和總體處理時間。
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服務器 的每個單一連接都維護着自己的存儲過程高速緩存。
花一點時間閱讀文章的其餘部分和評論。這很短,你會對這些問題有更好的理解。
- 1. 複雜查詢的存儲過程
- 2. 複雜查詢的MySQL存儲過程需要5分鐘
- 3. MySQL查詢緩存,複雜SQL查詢
- 4. 複雜的存儲過程
- 5. MySQL複雜查詢
- 6. Mysql複雜查詢
- 7. MySQL複雜查詢
- 8. MySQL複雜查詢
- 9. 在MongoDB中存儲(複雜)MongoDB查詢
- 10. Redis存儲和查詢複雜結構
- 11. Mysql存儲過程動態查詢
- 12. MySQL存儲過程的查詢
- 13. MySQL的存儲過程的查詢
- 14. MySQL查詢不存儲過程
- 15. MySQL(存儲)過程 - 參數和查詢
- 16. MySQL的複雜與和或查詢和
- 17. 複雜的SQL查詢與MySQL?
- 18. 使用LINQ查詢與存儲過程
- 19. 存儲過程與數組concatanation查詢
- 20. 與子查詢的存儲過程
- 21. 置換SQL查詢與存儲過程
- 22. PL/SQL複雜的存儲過程
- 23. 複雜的MySQL查詢?
- 24. mySQL複雜多項查詢
- 25. Mysql的php複雜查詢
- 26. MySQL的複雜查詢
- 27. MySQL查詢複雜ORDER BY
- 28. 複雜的MySQL查詢?
- 29. 複雜的MySQL查詢
- 30. 查詢mysql的複雜
MySQL在編譯存儲過程之前在現有版本的已建立會話中執行它們之前 – 2013-01-17 00:59:42