二、MySQL 物理設計

物理設計


一、定義數據庫、表及字段的命名規範

數據庫、表及字段的命名要遵守可讀性原則表意性原則長名原則

二、選擇合適的存儲引擎

存儲引擎 事務 鎖粒度 主要應用 忌用
InnoDB 支持 支持MVCC的行級鎖 事務處理
MyISAM 不支持 支持併發插入的表級鎖 select、insert 讀寫操作頻繁
MRG_MyISAM 不支持 支持併發插入的表級鎖 分段歸檔,數據倉庫 全局查找過多的場景
Archive 不支持 行級鎖 日誌記錄,只支持insert、select 需要隨機讀取、更新及刪除
Ndb cluster 支持 行級鎖 高可用性 大部分應用

三、爲表中的字段選擇合適的數據類型

1.原則

當一個列可以選擇多種數據類型是,應當優先考慮數字類型,其次是日期或二進制類型,最後是字符串類型。對於相同級別的數據類型,應該有效選擇佔用空間小的數據類型

數字類型 > 日期、二進制 > 字符串

2.整數類型

列類型 存儲空間 範圍(有符號) 範圍(無符號)
tinyint 1 字節 -128 ~ 127 0 ~ 255
smallint 2 字節 -32 768 ~ 32 767 0 ~ 65 535
mediumint 3 字節 -8 388 608 ~ 8 388 607 0 ~ 16 777 215
int/integer 4 字節 -2 147 483 648 ~ 2 147 483 647 0 ~ 4 294 967 295
bigint 8 字節 -9 233 372 036 854 775 808 ~ 9 223 372 036 854 775 807 0 ~ 18 446 744 073 709 551 615

3.實數類型

列類型 存儲空間 是否精確
float 4 字節
double 8 字節
decimal 每4個字節存9個數字,小數點佔一個字節

4.VARCHER、CHAR 類型

utf8 字符集爲例,存儲10個字符的話列定義爲VARCHAR(10)CHAR(10) 而不是 VARCHAR(30)CHAR(30)

a). VARCHAR類型的存儲特點

  • varchar 用於存儲變長的字符串,只佔用必要的存儲空間
  • 列的最大長度小於255則只佔用一個額外字節用於記錄字符串長度
  • 列的最大長度大於255則要佔用兩個額外字節用於記錄字符創長度

b).VARCHAR、CHAR 類型的選擇

1.VARCHAR 的長度選擇

  • 使用最小的符合需求的長度:MySQL 5.7 之前修改表結構需鎖表;5.7之後若原長度在255以內,且修改後長度也在255以內則不鎖表,否則同樣需要鎖表
  • varchar(5)、varchar(200)存儲 “MySQL” 字符串性能不同:MySQL優化查詢時會使用固定寬度,例如創建查詢臨時表時,需要更多的內存

2.VARCHAR 的適用場景

  • 字符串咧的最大長度比平均長度大很多
  • 字符串列很少被更新
  • 使用了utf8等多字節字符集存儲的字符串

3.CAHR 的特點

  • CHAR 類型是定長的
  • 字符串存儲在CHAR類型的列中會刪除末尾空格,VARCHAR不會刪除
  • CHAR 類型的最大寬度爲255,超過則使用VARCHAR

4.CAHR 的適用場景

  • 長度近似的值:手機號、身份證
  • 短字符串:性別
  • 經常更新的字符串:流轉狀態

4.日期數據

1.DATETIME 類型

  • 以 YYYY-MM-DD HH:MM:SS[.fraction] 格式存儲日期時間
    datetime = YYYY-MM-DD HH:MM:SS
    datetime(6) = YYYY-MM-DD HH:MM:SS[.fraction] (存儲微秒)
  • DATETIME 類型與時區無關,佔用8個字節的存儲空間
  • 時間範圍 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

2.TIMESTAMP 類型

  • 存儲由格林尼治時間1970年1月1日到當前時間的秒數
  • 以 YYYY-MM-DD HH:MM:SS[.fraction] 的格式顯示
  • 佔用4個字節,實際存儲爲 int
  • 時間範圍 1970-01-01 ~ 2038-01-19
  • 顯示依賴於所指定的時區
  • 在行的數據修改時可以自動修改timestamp列的值,默認第一列timestamp可自動更新,也可通過建表語句指定:可用於記錄數據修改的時間

3.DATE、TIME類型(MySQL5.7 之後)

  1. DATE類型
  • 佔用自己鵝湖比使用字符串、datetime、int 存儲要少,使用date類型只需要三個字節
  • 使用DATE類型還可利用日期時間函數進行日期之間的計算
  • 範圍 1000-01-01 ~ 9999-12-31
  1. TIME類型
  • 用於存儲時間數據,格式爲 HH:MM:SS

4.注意事項

  1. 不要使用字符串類型來存儲日期時間數據:a.日期時間類型通常比字符串佔用的存儲空間小;b.日期時間類型在進行查找過濾時可以利用日期來進行對比;c.日期時間類型還有着豐富的處理喊出,可以方便的對其進行日期計算
  2. 使用int存儲日期時間不如使用timestamp類型:本身即爲int存儲,但是展示時更易讀

四、總結

如何爲InnoDB選擇主鍵?

  • 主鍵應該儘可能的小:因爲每一個非主鍵索引都會附加主鍵的信息,如果我們主鍵非常大的話,會使索引變慢,影響查詢效率
  • 主鍵應該是順序增長的:避免了隨機IO的產生,增加數據的插入效率。如果主鍵不能保證順序增長,則有可能每次插入後都有可能進行隨機排序,會帶來額外的IO消耗
  • InnoDB的主鍵和業務主鍵可以不同:爲了保證業務主鍵的唯一性,可以設置唯一索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章