1. 程式人生 > >mysql數據庫設計之物理設計

mysql數據庫設計之物理設計

hat 無效 tex upd 設計 名稱 default nds 自定義

一、存儲引擎

技術分享圖片推薦使用Innodb,這也是mysql默認使用的存儲引擎,支持事務

二、屬性的選擇

字符選擇:

1、char,存定長,速度快,存在空間浪費的可能,會處理尾部空格,上限255字節。(utf-8, 一個漢字3字節 英文字母1字節)

2、varchar,存變長,速度慢,不存在空間浪費,不處理尾部空格,上限65535字節,但是有存儲長度實際65532字節最大可用。

3、text,存變長大數據,速度慢,不存在空間浪費,不處理尾部空格,上限65535字節,會用額外空間存放數據長度,故可以全部使用65535字節,最多可存20000漢字。

時間選擇:

int
1. 占用4個字節
2. 建立索引之後,查詢速度快

3. 條件範圍搜索可以使用使用between
4. 不能使用mysql提供的時間函數
結論:適合需要進行大量時間範圍查詢的數據表

datetime
1. 占用8個字節 2. 允許為空值,可以自定義值,系統不會自動修改其值

3. 實際格式儲存(Just stores what you have stored and retrieves the same thing which you have stored.)

4. 與時區無關(It has nothing to deal with the TIMEZONE and Conversion.)

5. 可以在指定datetime字段的值的時候使用now()變量來自動插入系統的當前時間。
結論:datetime類型適合用來記錄數據的原始的創建時間,因為無論你怎麽更改記錄中其他字段的值,datetime字段的值都不會改變,除非你手動更改它。 timestamp
1. 占用4個字節 2. 允許為空值,但是不可以自定義值,所以為空值時沒有任何意義。
3. TIMESTAMP值不能早於1970或晚於2037。這說明一個日期,例如‘1968-01-01‘,雖然對於DATETIME或DATE值是有效的,但對於TIMESTAMP值卻無效,如果分配給這樣一個對象將被轉換為0。

4.值以UTC格式保存( it stores the number of milliseconds)

5.時區轉化 ,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。

6. 默認值為CURRENT_TIMESTAMP(),其實也就是當前的系統時間。 7. 數據庫會自動修改其值,所以在插入記錄時不需要指定timestamp字段的名稱和timestamp字段的值,你只需要在設計表的時候添加一個timestamp字段即可,插入後該字段的值會自動變為當前系統時間。 8. 默認情況下以後任何時間修改表中的記錄時,對應記錄的timestamp值會自動被更新為當前的系統時間。 9. 如果需要可以設置timestamp不自動更新。通過設置DEFAULT CURRENT_TIMESTAMP 可以實現。 修改自動更新:
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE
修改不自動更新
`field_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 結論:timestamp類型適合用來記錄數據的最後修改時間,因為只要你更改了記錄中其他字段的值,timestamp字段的值都會被自動更新。(如果需要可以設置timestamp不自動更新)

三、反範式化

技術分享圖片

為了查詢更簡單:

技術分享圖片

優化之後:

技術分享圖片

技術分享圖片

mysql數據庫設計之物理設計