摘要:整數(shù)類型整數(shù)類型有,分別使用位存儲空間。實數(shù)類型實數(shù)類型有,分別占用,字節(jié)。簡單數(shù)據(jù)類型的操作需要更少的周期。
1. 整數(shù)類型
整數(shù)類型有:tinyint、smallint、mediumint、int、bigint,分別使用 8、16、24、32、64 位存儲空間。它們可以存儲的值范圍從 -2 的 (n-1) 次方到 2 的 (n-1) 次方 -1,n 是存儲空間的位數(shù)。
整數(shù)有可選的 unsigned 屬性(無符號類型),表示不允許有負(fù)值,因此可以使正數(shù)上限提高一倍。
有符號和無符號類型使用相同的存儲空間,并具有相同的性能,因此可以根據(jù)實際情況選擇合適的類型。
2. 實數(shù)類型實數(shù)類型有:FLOAT、DOUBLE ,分別占用 4,8 字節(jié)。
如果插入值的精度(即:數(shù)字總位數(shù))高于實際定義的精度,系統(tǒng)會自動進(jìn)行四舍五入處理,使值的精度達(dá)到要求。
其中 DECIMAL 也可以用來指定精度,并且它比 FLOAT 和 DOUBLE 更適合做精確計算。在本文就不做詳細(xì)介紹了,如果有人想了解的話可以給我留言,我下次再寫。
3. 字符串類型字符串類型有:
VARCHAR
CHAR
BLOB
TEXT
由于 BLOB 和 TEXT 不常用且由于篇幅問題,就不展開描述了。本文主要對 VARCHAR 和 CHAR 進(jìn)行介紹,它們的區(qū)別如下表:
對比內(nèi)容 | VARCHAR | CHAR |
---|---|---|
是否固定長度 | 否 | 是 |
存儲上限字節(jié) | 65535 | 255 |
保存或檢索值時,是否刪除字符串末尾空格 | 否 | 是 |
超過設(shè)置的范圍后,字符串是否會被截斷 | 否 | 是 |
除了以上不同之外,VARCHAR 還需要額外使用 1 個或 2 個字節(jié)來記錄字符串長度。如果列的最大長度小于或等于 255 字節(jié),則使用 1 個字節(jié),否則使用 2 個字節(jié)。
由于 VARCHAR 是變長的,所以在 update 時,可能使行變得比原來更長,這就導(dǎo)致需要進(jìn)行額外的工作。如果一個行占用的空間增加,并且在頁內(nèi)沒有更多空間可以存儲,在這種情況下,不同存儲引擎的處理方式不一樣的。例如:MyISAM 會將行拆分為不同的片段存儲,InnoDB 則需要分裂頁來使行可以放進(jìn)頁內(nèi)。
在選擇使用場景上,重點要抓住 VARCHAR 是變長,CHAR 是定長的特點。
比如在這些情況更適合使用 VARCHAR:
字符串的最大長度比平均長度大很多;
字段更新次數(shù)少(所以碎片不是問題);
使用了像 UTF-8 這樣復(fù)雜的字符集,每個字符都使用不同的字節(jié)數(shù)進(jìn)行存儲。
而在這些情況則更適合使用 CHAR:
存儲很短的字符串(而 VARCHAR 還要多一個字節(jié)來記錄長度,本來打算節(jié)約存儲的現(xiàn)在反而得不償失)
定長的字符串(如 MD5、uuid);
需要頻繁修改的字段。因為 VARCHAR 每次存儲都要有額外的計算,得到長度等工作;
這里拋出一個小問題:使用 VARCHAR(5) 和 VARCHAR(200) 來存儲 ‘hello’ 的空間開銷是一樣的。那么使用更短的列有什么好處呢?(思考幾秒鐘?)
答案:節(jié)約內(nèi)存,因為更長的列會消耗更多的內(nèi)存。MySQL 通常會分配固定大小的內(nèi)存塊來保存內(nèi)部值。尤其是使用內(nèi)存臨時表進(jìn)行排序或操作時會特別糟糕。在利用磁盤臨時進(jìn)行排序時也同樣糟糕。
所以最好的策略是只分配真正需要的空間。
4. 日期和時間類型下面表格是 TIMESTAMP 和 DATETIME 的一些對比:
對比內(nèi)容 | TIMESTAMP | DATETIME |
---|---|---|
占用字節(jié) | 4 | 8 |
時間范圍 | 1970-01-01 08:00:01 ~ 2038-01-19 11:14:07 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
存儲的數(shù)據(jù)是否隨時區(qū)變化 | 是 | 否 |
如果在插入數(shù)據(jù)時,沒有指定第一個 TIMESTAMP 列的值,MySQL 則將這個列設(shè)置為當(dāng)前時間,同時 TIMESTAMP 比 DATETIME 的空間效率更高。
最后,網(wǎng)上有很多討論,時間到底要使用 INT、TIMESTAMP、DATETIME 哪種類型更適合。我認(rèn)為這沒有一個固定答案,具體可以參考文章:《選擇合適的 MySQL 日期時間類型來存儲你的時間》,我放在原文鏈接里面了。
5. 設(shè)計合理的數(shù)據(jù)類型提供給大家 3 點設(shè)計原則:
更小的通常更好
簡單就好
盡量避免 NULL
下面對其詳細(xì)說明一下:
一般情況下,應(yīng)該選擇可以正確存儲數(shù)據(jù)的最小數(shù)據(jù)類型,因為它們占用更少的磁盤、內(nèi)存和 CPU 緩存,并且處理時需要的 CPU 周期也更少。
簡單數(shù)據(jù)類型的操作需要更少的 CPU 周期。例如,整型比字符操作代價更低,因為字符集和校對規(guī)則(排序規(guī)則)使字符比較比整型比較更復(fù)雜。
通常情況下,最好指定列為 NOT NULL,除非真的需要存儲 NULL 值。因為可為 NULL 的列會使索引、索引統(tǒng)計和值比較都更復(fù)雜??蔀?NULL 的列會使用更多的存儲空間,在 MySQL 里也需要特殊處理。
當(dāng)可為 NULL 的列被索引時,每個索引需要一個額外的字節(jié),在 MyISAM 里甚至還可能導(dǎo)致固定大小的索引變成可變大小的索引。通常把可為 NULL 的列改為 NOT NULL 帶來的性能比較小,所以在優(yōu)化時沒有必要先在現(xiàn)有表里修改這種情況。
參考:
《高性能 MySQL》
歡迎關(guān)注微信公眾號「不只Java」,后臺回復(fù)「電子書」,送說不定有你想要的呢
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72517.html
摘要:我們今天也來做一個萬能遙控器設(shè)計模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設(shè)計模式的一種建造者模式。設(shè)計模式的理論知識固然重要,但 計算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進(jìn)行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...
摘要:我們今天也來做一個萬能遙控器設(shè)計模式適配器模式將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。今天要介紹的仍然是創(chuàng)建型設(shè)計模式的一種建造者模式。設(shè)計模式的理論知識固然重要,但 計算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進(jìn)行操作,第二類是返回一個容器接口對象,上節(jié)我們介紹了...
摘要:設(shè)計方案的容易改變這就是所謂的軟件構(gòu)建的可維護(hù)性,可擴(kuò)展性和靈活性。這也可能表明類型或方法可能難以維護(hù)?;谠创a中不同運(yùn)算符和操作數(shù)的數(shù)量的合成度量。對修改的封閉這種模塊的源代碼是不可侵犯的。 大綱 軟件維護(hù)和演變可維護(hù)性度量模塊化設(shè)計和模塊化原則OO設(shè)計原則:SOLIDOO設(shè)計原則:GRASP總結(jié) 軟件維護(hù)和演變 什么是軟件維護(hù)? 軟件工程中的軟件維護(hù)是交付后修改軟件產(chǎn)品以糾正故障...
摘要:續(xù)前文后端好書閱讀與推薦,幾十天過去了,又看了兩本好書還有以前看過的書,這里依然把它們總結(jié)歸納一下,加入一些自己的看法有用的鏈接和可能的延伸閱讀,并推薦給需要的同學(xué)。 續(xù)前文 后端好書閱讀與推薦 - Mageek`s Wonderland ,幾十天過去了,又看了兩本好書(還有以前看過的書),這里依然把它們總結(jié)歸納一下,加入一些自己的看法、有用的鏈接和可能的延伸閱讀,并推薦給需要的同學(xué)。...
摘要:續(xù)前文后端好書閱讀與推薦,幾十天過去了,又看了兩本好書還有以前看過的書,這里依然把它們總結(jié)歸納一下,加入一些自己的看法有用的鏈接和可能的延伸閱讀,并推薦給需要的同學(xué)。 續(xù)前文 后端好書閱讀與推薦 - Mageek`s Wonderland ,幾十天過去了,又看了兩本好書(還有以前看過的書),這里依然把它們總結(jié)歸納一下,加入一些自己的看法、有用的鏈接和可能的延伸閱讀,并推薦給需要的同學(xué)。...
閱讀 2536·2023-04-25 14:54
閱讀 609·2021-11-24 09:39
閱讀 1819·2021-10-26 09:51
閱讀 3867·2021-08-21 14:10
閱讀 3494·2021-08-19 11:13
閱讀 2700·2019-08-30 14:23
閱讀 1817·2019-08-29 16:28
閱讀 3364·2019-08-23 13:45