自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL Schema與數(shù)據(jù)類型的優(yōu)化

數(shù)據(jù)庫(kù) MySQL
如果查詢中包含可為null的列,對(duì)Mysql來說更難優(yōu)化,因?yàn)榭蔀閚ull的列使得索引、索引統(tǒng)計(jì)和值都比較復(fù)雜。可為null的列會(huì)使用更多的存儲(chǔ)空間,在mysql中也需要特別處理。當(dāng)可為null的列被索引時(shí),每個(gè)索引記錄需要一個(gè)額外的字節(jié)。

[[207400]]

選擇優(yōu)化的數(shù)據(jù)類型:

1、 更小的通常更好:

一般情況下,應(yīng)該盡量使用可以正確存儲(chǔ)數(shù)據(jù)的最小數(shù)據(jù)類型。更小的數(shù)據(jù)類型通常更快,因?yàn)樗麄冋加酶俚拇疟P,內(nèi)存和cpu緩存,并且處理時(shí)需要的cpu周期也更少。

2、 簡(jiǎn)單就好

簡(jiǎn)單的數(shù)據(jù)類型操作通常需要更少的cpu周期。例如,整型比字符操作代價(jià)更低,因?yàn)樽址托?duì)規(guī)則(排序規(guī)則)使字符比較比整型更加復(fù)雜。注:應(yīng)使用mysql內(nèi)建的類型存儲(chǔ)時(shí)間和日期,而不是字符串。

3、 盡量避免null

如果查詢中包含可為null的列,對(duì)Mysql來說更難優(yōu)化,因?yàn)榭蔀閚ull的列使得索引、索引統(tǒng)計(jì)和值都比較復(fù)雜。可為null的列會(huì)使用更多的存儲(chǔ)空間,在mysql中也需要特別處理。當(dāng)可為null的列被索引時(shí),每個(gè)索引記錄需要一個(gè)額外的字節(jié)。

通常把可為null的列改為not null帶來的性能提升比較小。在調(diào)優(yōu)時(shí),沒有必要首先在現(xiàn)有的shema中查找并修改掉這個(gè)情況,除非確定這會(huì)導(dǎo)致問題。但是如果列上建索引,就應(yīng)盡量避免設(shè)計(jì)成可為null的列。

整數(shù)類型:

整數(shù)類型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分別使用8,16,24,32,64位存儲(chǔ)空間。他們可以存儲(chǔ)的值的范圍從-2的(n-1)次方到2的(n-1)次方-1,其中n是存儲(chǔ)空間的位數(shù)。

整數(shù)類型有可選的UNSIGNED屬性,表示不允許負(fù)值,這大致可以是正數(shù)的上限提高一倍。例如TINYINT UNSIGNED可以存儲(chǔ)的范圍是0~255,而TINYINT的存儲(chǔ)范圍是-128~127。

實(shí)數(shù)類型:

實(shí)數(shù)是帶有小數(shù)部分的數(shù)字。然后,他們不僅僅為了存儲(chǔ)小數(shù)部分;也可以使用DECIMAL存儲(chǔ)比BITINT還大的整數(shù)。MYSQL既支持精確類型,也支持不精確類型。

DECIMAL類型用于存儲(chǔ)精確的小數(shù),因?yàn)閐ouble類型和float類型在進(jìn)行計(jì)算時(shí),會(huì)因?yàn)榫葥p失導(dǎo)致一些數(shù)據(jù)的偏差。但是DECIMAL數(shù)據(jù)類型cpu不支持對(duì)其直接計(jì)算,cpu直接支持原生浮點(diǎn)計(jì)算,所以浮點(diǎn)運(yùn)算明顯更快。

因?yàn)樾枰~外的空間和計(jì)算開銷,所以應(yīng)該盡量只在對(duì)小數(shù)進(jìn)行精確計(jì)算時(shí)才使用DECIMAL-例如存儲(chǔ)財(cái)務(wù)數(shù)據(jù)。但是在數(shù)據(jù)量比較大的時(shí)候,可以考慮使用BITINT代替DECIMAL,將需要存儲(chǔ)的貨幣單位根據(jù)小數(shù)的位數(shù)乘以相應(yīng)的倍數(shù)即可。

字符串類型(varchar和char)

  • Varchar:

Varchar類型用于存儲(chǔ)可變長(zhǎng)字符串,是最常見的字符串類型。他比定長(zhǎng)類型更節(jié)省空間,因?yàn)樗鼉H使用必要的空間(例如,越短的字符串使用越少的空間)。所以,varchar節(jié)省了存儲(chǔ)空間,對(duì)性能也有幫助。但是,由于行是邊長(zhǎng)的,在update是可能使行變得比原來更長(zhǎng),這就導(dǎo)致需要做額外的操作。如果一個(gè)行占用的空間增長(zhǎng),并且頁(yè)內(nèi)沒有更多的空間存儲(chǔ)。MyISAM會(huì)將行拆成不同的片段存儲(chǔ),InnoDB則需要分裂頁(yè)來使行可以放進(jìn)頁(yè)內(nèi)。

注:InnoDB更加靈活,它可以把過長(zhǎng)的varchar存儲(chǔ)為BLOB。

  • Char類型:

Char類型適合存儲(chǔ)很短的字符串,或者所有值都接近同一個(gè)長(zhǎng)度。例如,char類型非常適合存儲(chǔ)密碼的md5值,因?yàn)樗嵌ㄩL(zhǎng)的值。還有用戶的身份證號(hào)以及手機(jī)號(hào)碼。對(duì)于經(jīng)常變更的數(shù)據(jù),char也比vachar更好,因?yàn)槎ㄩL(zhǎng)的char類型不容易產(chǎn)生碎片。對(duì)于非常短的列,char也比varchar在存儲(chǔ)空間上更有效率。例如用char(1)存儲(chǔ)Y和N的值,如果采用單字節(jié)字符集只需要一個(gè)字節(jié),但是varchar(1)卻需要兩個(gè)字節(jié),因?yàn)檫€有一個(gè)記錄長(zhǎng)度的額外字節(jié)。

Varchar(5)和varchar(200)存儲(chǔ)‘hello’時(shí)空間開銷是一樣的,但是Varchar(5)會(huì)有很大的優(yōu)勢(shì),因?yàn)楦L(zhǎng)的列會(huì)消耗更多的內(nèi)存,因?yàn)镸ysql通常會(huì)分配固定帶下的內(nèi)存塊來保存內(nèi)部值。尤其是使用內(nèi)存臨時(shí)表進(jìn)行排序和操作時(shí)會(huì)特別糟糕。在利用磁盤臨時(shí)表進(jìn)行排序時(shí)也同樣糟糕。

時(shí)間類型

DateTime和TimeStamp

  • DateTime

這個(gè)類型能保存大范圍的值,從1001年到9999年,精度為秒。它把日期和時(shí)間封裝到格式為YYYYMMDDHHMMSS的整數(shù)里,與時(shí)區(qū)無關(guān)。使用8個(gè)字節(jié)的存儲(chǔ)空間。

  • TimeStamp:

存儲(chǔ)1970年1月1日午夜以來的描述,他和Unix時(shí)間戳相同。TimeStamp只使用4個(gè)字節(jié)的存儲(chǔ)空間,因此它的范圍比DateTime小的多;只能表示從1970年到2038年。

TimeStamp顯示的值也依賴于時(shí)區(qū)。Mysql服務(wù)器,操作系統(tǒng),以及客戶端連接都有時(shí)區(qū)設(shè)置。

TimeStamp也有DATETIME沒有的特殊屬性。默認(rèn)情況下,如果插入時(shí)沒有指定第一個(gè)TimeStamp列的值,Mysql會(huì)設(shè)置這個(gè)列的值為當(dāng)前時(shí)間。在插入一行記錄時(shí),Mysql默認(rèn)也會(huì)更新第一個(gè)TimeStamp列的插入和更新操作。最后,TimeStamp列默認(rèn)為not null,這也和其他的數(shù)據(jù)類型不一樣。 

責(zé)任編輯:龐桂玉 來源: 揚(yáng)花落盡丶的博客
相關(guān)推薦

2020-10-26 07:16:10

MySQLSchema數(shù)據(jù)

2011-05-11 10:39:01

SQL Serverdatetime數(shù)據(jù)類優(yōu)化誤區(qū)

2010-08-10 17:17:59

2018-01-02 20:35:00

數(shù)據(jù)庫(kù)MySQLDB2

2010-05-17 16:18:28

MySQL數(shù)據(jù)類型

2010-05-20 18:05:38

2010-11-29 10:09:26

SQL Server

2017-07-10 13:38:07

MySQL數(shù)據(jù)類型整數(shù)類型

2010-06-10 10:06:01

MySQL數(shù)據(jù)類型

2010-10-08 14:04:44

MySQL數(shù)值數(shù)據(jù)類型

2018-11-15 09:45:47

JavaScript數(shù)據(jù)類型變量

2010-10-15 13:28:34

MySql數(shù)據(jù)類型

2021-05-31 16:09:31

MySQLSchema設(shè)計(jì)

2010-06-04 11:15:23

MySQL自增主鍵

2010-05-31 10:35:12

MySQL數(shù)據(jù)類型

2010-08-11 09:14:33

DB2數(shù)據(jù)類型

2019-08-12 11:40:48

數(shù)據(jù)庫(kù)SQLite3數(shù)據(jù)類型

2023-04-06 07:49:23

Python數(shù)據(jù)類型

2010-07-22 17:47:32

SQL Server數(shù)

2010-06-13 18:00:56

MySQL數(shù)據(jù)類型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)