MySQL?數(shù)據(jù)類型及最優(yōu)選取規(guī)則
數(shù)據(jù)類型
日常開發(fā)中,最常使用到的 MySQL 中常用的數(shù)據(jù)類型有 : 整型, 浮點型, 定點數(shù), 字符型, 時間日期類型. 下面對其分別進行總結。
整型
格式為 : INT[(M)] [UNSIGNED] [ZEROFILL]
- 取值范圍:如果是
unsigned
無符號位 , 則最大值翻倍, 如 tinyint unsigned 的取值范圍為 (0~256). - 注意:INT(1) 和 INT(10) 沒有區(qū)別, 占用的內(nèi)存都一樣, 并不是代表其最大位數(shù),只是加上 (M) 值后, 在 CMD 中顯示的結果的寬度不同而已. 只有在加上 zerofill 零填充后 M 才表現(xiàn)出有點點效果, 比如 int(3) zerofill, 插入到數(shù)據(jù)庫里的是 10, 則實際插入為 010, 也就是在前面補充加了一個0.
- Java 中的
Long
類型, 和 MySQL 中的bigint
相對應. - Java 中的
Integer
類型, 和 MySQL 中的int
相對應. - Java 中的
Boolean
類型, 和 MySQL 中的tinyint
相對應.false 代表 0, true 代表 1
.
浮點型
- 設一個字段定義為 float(5,3), 5 表示在 CMD 中顯示的總位數(shù)是 5 位, 3 表示小數(shù)位是 3 位.
- 小數(shù)位超過指定長度, 對后面的數(shù)字按照四舍五入截取. 所以如果插入一個數(shù) 123.45678, 實際數(shù)據(jù)庫里存的是123.457, 進行了四舍五入截取.
- 小數(shù)位如果都是0, 則不保存小數(shù)位, 直接保存整數(shù).
定點數(shù)
浮點型在數(shù)據(jù)庫中存放的是近似值, 而定點類型在數(shù)據(jù)庫中存放的是精確值. 所以對于金額等精度要求高的數(shù)據(jù), 使用定點數(shù) decimal 來保存.
decimal(m,d)
參數(shù) m 是總個數(shù), d 是小數(shù)位. ( m<65, d<30, d<m )
字符型
字符型 | 含義 | 占用字節(jié)數(shù) |
---|---|---|
char(n) | 固定長度, 最多 255 個字符 | 4 byte |
varchar(n) | 可變長度, 最多 65535 個字符 | 實際存入字節(jié)數(shù)+1 |
char 類型的字符串檢索速度要比 varchar 類型的快
. 所以能 char 的優(yōu)先 選擇 char
.- char(n) 若存入字符數(shù)小于 n, 則以空格補于其后, 查詢之時再將空格去掉. 所以
char 類型存儲的字符串末尾不能有空格
, varchar 不限于此. - char(n) 固定長度, char(4) 不管是存入幾個字符, 都將占用 4 個字節(jié). varchar 可變長度, 是存入的實際字符數(shù)+1個字節(jié)(n<=255)或 2 個字節(jié)(n>255), 所以 varchar(4), 存入3 個字符將占用 4 個字節(jié).
- varchar(10) 的 10 代表了申請的空間長度, 即
存儲的數(shù)據(jù)的最大長度
, 而 int(10) 的 10 只是代表了展示的長度.
日期時間型
日期時間類型 | 占用空間(字節(jié)數(shù)) | 日期格式 |
---|---|---|
DATETIME | 8 byte | YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 4 byte | YYYY-MM-DD HH:MM:SS |
DATE | 4 byte | YYYY-MM-DD |
TIME | 3 byte | HH:MM:SS |
YEAR | 1 byte | YYYY |
- 根據(jù)實際需要選擇能夠滿足的最小存儲的類型即可. 比如 :
DATE 用于表示 年月日, 生日字段使用 DATE 類型即可
. 這樣不但能節(jié)省內(nèi)存, 還能提高表的操作效率. - 如果要記錄年月日時分秒, 而且記錄的年代比較久遠, 最好使用 DATETIME. 因為
TIMESTAMP 可以表示的年代范圍比 DATETIME 少的多
. - 如果記錄的日期需要用到時區(qū), 需要選擇 TIMESTAMP.
- 一個表中至多
只能有一個字段
設置 CURRENT_TIMESTAMP. 并且 CURRENT_TIMESTAMP 只適合 TIMESTAMP 類型的字段.
CREATE TABLE USER( ... create_time timestamp NULL default CURRENT_TIMESTAMP, -- 默認為當前時間 ... )
字段類型的選取原則
- 字段類型優(yōu)先級 :
整型 > date,time > char,varchar > blob
原因:整型運算快, 且節(jié)省空間. char, varchar 要考慮字符集的轉(zhuǎn)換與排序時的校對集, 所以速度慢.
- 優(yōu)先選擇
占空間小
的類型.
原因 : 小空間的類型占用的磁盤, 內(nèi)存, CPU 緩存, CPU 處理時間都更少.
對于字符型和數(shù)字型, 優(yōu)先選擇數(shù)字型
.
比如 : 應該使用整型來存儲 IP 地址, 而不是字符型. 應該使用日期時間類型來存儲日期時間, 而不是字符型.
- 對于 char 和 varchar
如果列中的數(shù)據(jù)長度差不多一致
, 比如 : 身份證號, 學號等, 則應該考慮使用 char
類型.
對于那些長度未知
的字符串, 使用 varchar
.
如果列中的最大數(shù)據(jù)長度小于 50 Byte (15個字符左右), 則一般考慮使用 char.
- 對于 decimal 和 float:
精確數(shù)據(jù)只能使用 decimal 類型
.
非精確數(shù)據(jù)優(yōu)先使用 float 類型, ( float 比 decimal 的存儲空間小 )
- 對于那些可能值很有限的列,
使用 tinyint 代替 varchar / int
比如記錄移動設備平臺, 只有兩個值:android, ios, 那么就可以使用 0 表示 android, 1 表示 ios, 并寫好注釋.
不要濫用 bigint
, 比如文章表的主鍵 id 字段, 用 int 就行了, 21 億篇文章的上限足夠使用了.
以上原則主要是從以下角度考慮 :
- 查詢速度:
定長數(shù)據(jù)比變長數(shù)據(jù)查詢快
, 因為定長數(shù)據(jù)與數(shù)據(jù)之間的偏移是固定的, 很容易計算下一個數(shù)據(jù)的偏移.
而變長數(shù)據(jù)則還需要多一步去查詢下一個數(shù)據(jù)的偏移量. 不過定長數(shù)據(jù)可能會浪費更多的存儲空間.
- 排序速度:在對數(shù)據(jù)進行
比較 ( 查詢條件, JOIN 條件以及排序 ) 操作
時,同樣的數(shù)據(jù), 數(shù)字的處理比字符串快
.
字符串的比較與當前的排序規(guī)則有關, 它需要去查詢當前排序規(guī)則的字典順序, 而數(shù)字不需要.
到此這篇關于MySQL 數(shù)據(jù)類型及最優(yōu)選取規(guī)則的文章就介紹到這了,更多相關MySQL 數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux系統(tǒng)下安裝配置解壓版的MySQL數(shù)據(jù)庫圖解
這篇文章主要介紹了linux系統(tǒng)下安裝配置解壓版的MySQL數(shù)據(jù)庫的相關資料,需要的朋友可以參考下2017-12-12MySQL使用show?effective?grants查看權限官方解讀
這篇文章主要為大家介紹了MySQL使用show?effective?grants查看權限,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07MHA實現(xiàn)mysql主從數(shù)據(jù)庫手動切換的方法
這篇文章主要介紹了MHA實現(xiàn)mysql主從數(shù)據(jù)庫手動切換的方法,詳細的講述了主從數(shù)據(jù)庫切換的步驟與方法,非常實用,需要的朋友可以參考下2014-10-10MySQL Workbench導入excel數(shù)據(jù)的實現(xiàn)示例
本文主要介紹了MySQL Workbench導入excel數(shù)據(jù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01