學習筆記 | MySQL 使用原則和設計規範

01 MySQL 使用原則和設計規範

  • MySQL 雖然具有很多特性並提供了很多功能,但是有些特性會嚴重影響它的性能,比如,在數據庫裏進行計算,寫大事務、大 SQL、存儲大字段等。

想要發揮 MySQL 的最佳性能,需要遵循 3 個基本使用原則。

  • 首先是需要讓 MySQL 迴歸存儲的基本職能:MySQL 數據庫只用於數據的存儲,不進行數據的複雜計算,不承載業務邏輯,確保存儲和計算分離;
  • 其次是查詢數據時,儘量單表查詢,減少跨庫查詢和多表關聯;
  • 還有就是要杜絕大事務、大 SQL、大批量、大字段等一系列性能殺手。
  • 大事務,運行步驟較多,涉及的表和字段較多,容易造成資源的爭搶,甚至形成死鎖。一旦事務回滾,會導致資源佔用時間過長。
  • 大 SQL,複雜的 SQL 意味着過多的表的關聯,MySQL 數據庫處理關聯超過 3 張表以上的 SQL 時,佔用資源多,性能低下。
  • 大批量,意味着多條 SQL 一次性執行完成,必須確保進行充分的測試,並且在業務低峯時段或者非業務時段執行。
  • 大字段,blob、text 等大字段,儘量少用。必須要用時,儘量與主業務表分離,減少對這類字段的檢索和更新。

下面具體講解數據庫的基本設置規則:

  • 必須指定默認存儲引擎爲 InnoDB,並且禁用 MyISAM 存儲引擎,隨着 MySQL 8.0 版本的發佈,所有的數據字典表都已經轉換成了 InnoDB,MyISAM 存儲引擎已成爲了歷史。
  • 默認字符集 UTF8mb4,以前版本的 UTF8 是 UTF8mb3,未包含個別特殊字符,新版本的 UTF8mb4 包含所有字符,官方強烈建議使用此字符集。
  • 關閉區分大小寫功能。設置 lower_case_tables_name=1,即可關閉區分大小寫功能,即大寫字母 T 和小寫字母 t 一樣。

這裏在實踐中有個小問題,如何讓系統中區分大小寫的庫錶轉換爲不區分大小寫的庫表呢?因爲要修改底層數據,還是比較麻煩的,操作步驟如下。

  • MySQL dump 導出數據庫。
  • 修改參數 lower_case_tables_name=1
  • 導入備份數據時,必須停止數據庫,停止業務,影響非常大。
  • 開啓 per-table 表空間,開啓後,每張業務表會單獨創建一個獨立於系統表空間的表空間,便於空間的回收,數據的遷移。

MySQL 數據庫提供的功能很全面,但並不是所有的功能性能都高效。

  • 存儲過程、觸發器、視圖、event。爲了存儲計算分離,這類功能儘量在程序中實現。這些功能非常不完整,調試、排錯、監控都非常困難,相關數據字典也不完善,存在潛在的風險。一般在生產數據庫中,禁止使用。
  • lob、text、enum、set。這些字段類型,在 MySQL 數據庫的檢索性能不高,很難使用索引進行優化。如果必須使用這些功能,一般採取特殊的結構設計,或者與程序結合使用其他的字段類型替代。比如:set 可以使用整型(0,1,2,3)、註釋功能和程序的檢查功能集合替代。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章