以下指南涵蓋了開發 MySQL 應用程式時,對於來自 Python 背景的開發人員來說可能不那麼顯而易見的方面
為了安全起見,請勿在您的主要腳本中硬式編碼連線和登入資料庫所需的值。Python 有一個
config.py
模組的慣例,您可以在其中將這些值與程式碼的其他部分分開。Python 腳本通常會在記憶體中建立和拆解大型資料結構,直到可用 RAM 的限制。由於 MySQL 通常處理的資料集比可用記憶體大得多,因此優化儲存空間和磁碟 I/O 的技術尤其重要。例如,在 MySQL 資料表中,您通常會使用數值 ID 而非基於字串的字典鍵,以便索引鍵值緊湊且長度可預測。這對於構成 主要索引鍵 的欄位尤其重要,因為這些欄位值會複製在每個 次要索引 中。
-
任何接受輸入的應用程式都必須預期處理錯誤的資料。
錯誤的資料可能是意外的,例如超出範圍的值或格式錯誤的字串。應用程式可以使用伺服器端檢查,例如 唯一約束 和 NOT NULL 約束,以防止錯誤的資料進入資料庫。在用戶端,請使用例外處理程式等技術來報告任何問題並採取糾正措施。
錯誤的資料也可能是故意的,代表 「SQL 注入」攻擊。例如,輸入值可能包含引號、分號、
%
和_
通配符號以及在 SQL 語句中具有意義的其他字元。驗證輸入值以確保它們僅具有預期的字元。逸出任何可能在代入 SQL 語句時更改預期行為的特殊字元。在未先進行驗證和逸出的情況下,切勿將使用者輸入值串連到 SQL 語句中。即使接受其他程式產生的輸入,也要預期其他程式也可能已受損,並且正在向您傳送不正確或惡意的資料。 由於 SQL 查詢的結果集可能非常大,請使用適當的方法在您迴圈處理結果集時擷取其中的項目。fetchone() 在您知道結果集包含單列時,擷取單一項目。fetchall() 在您知道結果集包含可以舒適地放入記憶體的有限列數時,擷取所有項目。fetchmany() 是在您無法預測結果集大小時的通用方法:您會不斷呼叫它並迴圈處理傳回的項目,直到沒有更多結果要處理。
-
由於 Python 已經有方便的模組(例如
pickle
和cPickle
)可在磁碟上讀寫資料結構,因此您選擇改為儲存在 MySQL 中的資料可能具有特殊特性太大而無法一次全部放入記憶體中。 您可以使用
SELECT
語句僅查詢您需要的精確項目,並使用 彙總函數 對多個項目執行計算。您可以設定 MySQL 伺服器中的innodb_buffer_pool_size
選項,以將一定量的 RAM 專用於快取資料表和索引資料。太複雜而無法以單一資料結構表示。 您可以將資料劃分到不同的 SQL 資料表中。您可以使用 聯結 查詢重新組合來自多個資料表的資料。您可以透過設定 外部索引鍵 關係,確保相關資料在不同資料表之間保持同步。
頻繁更新,可能由多個使用者同時更新。 更新可能只會影響資料的一小部分,這使得每次寫入整個結構都浪費資源。您可以使用 SQL
INSERT
、UPDATE
和DELETE
語句同時更新不同的項目,僅將變更的值寫入磁碟。您可以使用InnoDB
資料表和 交易,防止寫入操作相互衝突,並在更新基礎資料時傳回一致的查詢結果。
使用 MySQL 的效能最佳做法可以協助您的應用程式進行擴充,而無需進行重大的重寫和架構變更。如需 MySQL 效能的最佳做法,請參閱 最佳化。它提供了 SQL 調整、資料庫設計和伺服器設定的指南和提示。
您可以透過學習 MySQL SQL 語句來避免重複發明輪子,以進行常見操作:查詢中要使用的運算子、大量載入資料的技術等等。某些語句和子句是 SQL 標準定義的基本語句的擴充。如需主要類別的語句,請參閱 資料操作語句、資料定義語句 和 SELECT 語句。
-
從 Python 發出 SQL 語句通常涉及宣告非常長、可能跨越多行的字串文字。由於 SQL 語句中的字串文字可以用單引號、雙引號括起來,或者包含任何這些字元,為了簡單起見,您可以使用 Python 的三引號機制來括住整個語句。例如
'''It doesn't matter if this string contains 'single' or "double" quotes, as long as there aren't 3 in a row.'''
您可以使用
'
或"
字元來三引號跨越多行的字串文字。 快速、可擴充的 MySQL 應用程式的許多秘密,都涉及在設定程序的開始時使用正確的語法,也就是
CREATE TABLE
語句中。例如,Oracle 建議大多數資料表使用ENGINE=INNODB
子句,並在 MySQL 5.5 及更新版本中將InnoDB
設定為預設儲存引擎。使用InnoDB
資料表可以啟用交易行為,有助於讀寫工作負載的可擴充性,並提供自動 當機復原。另一個建議是為每個資料表宣告一個數值 主要索引鍵,這提供了最快的方式來尋找值,並且可以作為其他資料表中相關值的指標 (外部索引鍵)。此外,在CREATE TABLE
語句中,使用最緊湊的欄位資料類型來滿足您的應用程式需求,有助於效能和可擴充性,因為這使資料庫伺服器能夠在記憶體和磁碟之間移動較少的資料。