Mysql學(xué)習(xí)總結(jié)(17)MySQL數(shù)據(jù)庫(kù)表設(shè)計(jì)優(yōu)化_MySQL

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

mysql支持很多種不同的數(shù)據(jù)類型,并且選擇正確的數(shù)據(jù)類型對(duì)于獲得高性能至關(guān)重要。不管選擇何種類型,下面的簡(jiǎn)單原則都會(huì)有助于做出更好的選擇:

(1).更小通常更好

一般來(lái)說(shuō),要試著使用正確地存儲(chǔ)和表示數(shù)據(jù)的最小類型。更小的數(shù)據(jù)類型通常更快,因?yàn)樗鼈兪褂昧烁俚拇疟P(pán)空間、內(nèi)存和CPU緩存,而且需要的CPU周期也更少。

但是要確保不人低估需要保存的值,在架構(gòu)中的多個(gè)地方增加數(shù)據(jù)類型的范圍是一件極其費(fèi)力的工作。如果不確實(shí)需要什么數(shù)據(jù)類型,就選擇你認(rèn)為不會(huì)超出范圍的最小類型。

(2).簡(jiǎn)單就好

越簡(jiǎn)單的數(shù)據(jù)類型,需要的CPU周期就越少。例如:比較整數(shù)的代價(jià)小于比較字符,因?yàn)樽址团判蛞?guī)則使字符比較更復(fù)雜。

(3).盡量避免空(NULL)

要盡可地把字段定義為NOT NULL 。即使應(yīng)用程序無(wú)須保存NULL,也有許多表包含了可為空的列,這僅僅是因?yàn)樗鼮槟J(rèn)選項(xiàng),除非真的要保存NULL,否則就把列定義為NOT NULL。

MySQL難以優(yōu)化了使用了可空列的查詢,它會(huì)使索引、索引統(tǒng)計(jì)和值更加復(fù)雜。可空列需要更多的存儲(chǔ)空間,還需要在MySQL內(nèi)部進(jìn)行特殊處理。當(dāng)可空列被索引的時(shí)候,每條記錄都需要一個(gè)額外的字節(jié),還能導(dǎo)致MyISAM中固定大小的索引(例如:一個(gè)整數(shù)列上的索引)變成可變大小的索引。

即使要在表中存儲(chǔ)可為空的字段,也是有辦法不使用NULL的,可以考慮使用0,特殊值或字符串來(lái)代替它。

把NULL列改為NOT NULL 帶來(lái)的性能提升很小,所以除非確定它引入了問(wèn)題,否則就不要把它當(dāng)成優(yōu)先的優(yōu)化措施。如果計(jì)劃對(duì)列進(jìn)行索引,就要盡量避免把它設(shè)置為可為空(NULL)

2.整數(shù)

數(shù)字有兩種類型:整數(shù)和實(shí)數(shù),如果存儲(chǔ)整數(shù),就可以使用這幾種整數(shù)類型:tinyint, smallint, mediumint, int, bigint ,它們分別需要8、16、24、32、64位存儲(chǔ)空間。

整數(shù)類型有可選的unsigned(無(wú)符號(hào))屬性,它表示不允許為負(fù)數(shù),并大致把正上限提高了一倍,例如:tinyint unsigned保存的翻圍為0到255,而不是-127到128。

Signed(有符號(hào))和unsigned(無(wú)符號(hào))類型占用的存儲(chǔ)空間是一樣的,性能也一樣。因此可以根據(jù)實(shí)際情況采用合適的類型。

你的選擇將會(huì)決定MySQL把數(shù)據(jù)保存在內(nèi)存中還是磁盤(pán)上,然而,整數(shù)運(yùn)算通常使用64位的bingint整數(shù)。

MySQL還允許你對(duì)整數(shù)類型定義寬度,比如int(11)。這對(duì)于大在多數(shù)應(yīng)用程序是沒(méi)有意義的,它不限制值的范圍,只規(guī)定了mysql的交互工具(例如命令客戶端)用來(lái)顯示字符的個(gè)數(shù)。對(duì)于存儲(chǔ)計(jì)算,int(1)和int(20)是一樣的。

3.實(shí)數(shù)

實(shí)數(shù)有分?jǐn)?shù)部分,然而,它們并不僅僅是分?jǐn)?shù)。可以使用decimal保存比出bigint還大的整數(shù)。MySQL同時(shí)支持精確與非精確類型。

Float和double類型支持使用標(biāo)準(zhǔn)的浮點(diǎn)運(yùn)算進(jìn)行近似計(jì)算。如果想知道浮點(diǎn)運(yùn)算到底如何進(jìn)行,則要研究生平臺(tái)浮點(diǎn)數(shù)的具體實(shí)現(xiàn)。

比較起decimal類型,浮點(diǎn)類型保存同樣大小的值使用的空間通常更小,float類型占用4個(gè)字節(jié),double占用8個(gè)字節(jié),而且精度更大,范圍更廣。和整數(shù)一樣,你選擇的僅僅是存儲(chǔ)類型。mysql在內(nèi)部對(duì)浮點(diǎn)類型使用double進(jìn)行計(jì)算。

由于需要額外的空間和計(jì)算開(kāi)銷,只有在需要對(duì)小數(shù)進(jìn)行精確的時(shí)候才使用decimal,比如保存金融數(shù)據(jù)。

4.字符串類型

Varchar和char類型

varchar:保存了可變長(zhǎng)度的字符串,是使用得最多的字符串類型,它能比固定類型占用更少的存儲(chǔ)空間,因?yàn)樗徽加昧俗砸研枰目臻g(也就是說(shuō)較短的值占用的空間更小)。它使用額外的1-2個(gè)字節(jié)來(lái)存儲(chǔ)值的長(zhǎng)度。Varchar能節(jié)約空間,所以對(duì)性能有幫助。然而,由于行的長(zhǎng)度是可變的,它們?cè)诟碌臅r(shí)候可能會(huì)發(fā)生變化,這會(huì)引起額外的工作。當(dāng)最大長(zhǎng)度遠(yuǎn)大于平均長(zhǎng)度,并且很少發(fā)生更新的時(shí)候,通常適合用varchar。這時(shí)候碎片就不會(huì)成為問(wèn)題,還有你使用復(fù)雜的字符集,如utf-8時(shí),它的每個(gè)字符都可能會(huì)占用不同的存儲(chǔ)空間。Varchar存取值時(shí)候,MySQL不會(huì)去掉字符串末尾的空格。

char:固定長(zhǎng)度,char存取值時(shí)候,MySQL會(huì)去掉末尾的空格。Char在存儲(chǔ)很短的字符串或長(zhǎng)度近似相同的字符的時(shí)候很有用。例如,char適用于存儲(chǔ)密碼的MD5哈希值,它的長(zhǎng)度總是一樣的。對(duì)于經(jīng)常改變的值,char也好于varchar,因?yàn)楣潭ㄩL(zhǎng)度的行不容易產(chǎn)生碎片,對(duì)于很短的列,char的效率也高于varchar。Char(1)字符串對(duì)于單字節(jié)字符集只會(huì)占用1個(gè)字節(jié),而varchar(1)則會(huì)占用2個(gè)字節(jié),因?yàn)橛幸粋€(gè)字節(jié)用來(lái)存儲(chǔ)其長(zhǎng)度。

Char和varchar的兄弟類型為binary和varbinary,它們用于保存二進(jìn)制的字符串,二進(jìn)制字符串的傳統(tǒng)的字符串很類似,但是它們保存的是字節(jié)而不是字符。填充也有所不同,MySQL使用

精品久久亚洲中文无码| 国内精品久久久久久久久电影网| 久久电影网一区| 91久久精品电影| 日韩欧美亚洲国产精品字幕久久久 | 国产69精品久久久久777| 国产午夜精品久久久久免费视| 久久久WWW成人免费精品| 久久99国产一区二区三区| 亚洲国产视频久久| 精品久久久久久国产| 久久亚洲欧洲国产综合| 7777久久亚洲中文字幕| 亚洲成av人片不卡无码久久| 久久成人国产精品| 精品综合久久久久久98| 久久强奷乱码老熟女| 久久er99热精品一区二区| 中文字幕亚洲综合久久菠萝蜜| www性久久久com| 国产精品久久久福利| 午夜天堂av天堂久久久| 久久99精品国产| 国产精品热久久无码av| 国产成人精品久久二区二区| 欧美一区二区三区久久综合| 午夜精品久久久久久久无码| 一级做a爰片久久毛片人呢| 青青草国产精品久久久久| www久久久天天com| 狠狠色丁香婷婷综合久久来来去| 99久久精品国产一区二区| 久久久久国产精品三级网| 久久有码中文字幕| 久久99精品久久久久久久不卡| 无遮挡粉嫩小泬久久久久久久| 亚洲AV日韩精品久久久久| 久久香蕉一级毛片| 久久精品国产亚洲AV久| 99久久国语露脸精品国产| 日韩十八禁一区二区久久|