2014-12-26 71 views
2

我有一個長期存在的C++程序,它針對MySQL數據庫執行各種SQL語句。我目前在每個需要SELECT/INSERT/UPDATE的函數中使用一堆靜態sql :: PreparedStatement *創建(一次),然後重新綁定並重復執行。這種運作良好,但我想了解一下服務器和程序的資源使用情況:MySQL PreparedStatement警告

  • 哪裏PreparedStatement的每一個存儲其信息(客戶端/服務器/兩?)
  • 難道我擔心一個PreparedStatement的會壞,但其餘的都可以嗎?
  • 我應該偶爾刷新/重新創建PreparedStatements嗎?
  • 是否打開但閒置PreparedStatements在兩次使用之間佔用重要的DB資源?
  • 有沒有更好的方式來處理需要執行20-30個不同類型的查詢的程序中的數據庫活動,當查詢偶爾發生而不是以任何特定順序發生時?

謝謝!

回答

0

每一製備的語句解析,優化並存儲在數據庫中的會話,所以它不佔用資源,同時它是積極的和有每個會話準備語句的最大數量。 所採用的資源因數據庫引擎和驅動程序而異。 根據您準備好的語句的具體內容以及它們綁定到變量和執行的頻率以及它們的簡單性或複雜性,您可能需要考慮使用存儲過程來實現其中至少一些。

對於max_prepared statement_count參考是here

爲了監控準備好的語句使用多少內存,您可能需要運行一點測試:在準備語句之前獲取您的進程看到的空閒內存,然後在準備之後再次獲取它,查看該語句使用多少內存,並在關閉聲明後再多一次,以查看是否所有內容都已釋放。

執行SQL語句之前,此會的工作,因爲返回可能會有所不同,並會影響總的可用內存爲您在中間測量步驟的過程的數據量。

此外,你可能想看看here,並且here

+0

謝謝,這是非常有用的信息。您是否有(或知道在哪裏可以找到)內存使用量的近似數字或每個會話的最大準備語句數?如果我遠低於極限,我不會爲此設計一些複雜的框架,但如果我接近,我現在可能會咬緊牙關。 (所有的語句都非常簡單 - INSERT或UPDATE或單表SELECT,除了有時會返回很多行以外,沒有什麼能夠使DB工作得很辛苦。) –

+0

請參閱我的編輯。我希望你覺得這對你有幫助。 – DNT

+0

max_prepared_statement_count配置項非常令人放心(尤其是因爲它是一個服務器範圍的值)。我知道我的服務器應該看到什麼樣的利用率,我預期的PreparedStatements數量遠低於16k。我會討論內存工具,但實際上,除非PreparedStatement分配了很多兆字節(這似乎不太可能),我不會在那裏遇到任何問題。再次感謝! –