如何掌握MySQL數(shù)據(jù)庫(kù)中動(dòng)態(tài)表的特征
以下的文章主要介紹的是如何正確掌握MySQL數(shù)據(jù)庫(kù)中動(dòng)態(tài)表的特征,可以說(shuō)動(dòng)態(tài)表在MySQL數(shù)據(jù)庫(kù)中使用頻率還是很大的,所以MySQL數(shù)據(jù)庫(kù)中動(dòng)態(tài)表的掌握也是一件很重要的事情,以下就是文章的具體內(nèi)容。
如果一個(gè)MyISAM表包含任何可變長(zhǎng)度列(VARCHAR, BLOB或TEXTDynamic),或者如果一個(gè)表被用ROW_FORMAT=DYNAMIC選項(xiàng)來(lái)創(chuàng)建,動(dòng)態(tài)存儲(chǔ)格式被使用。
這個(gè)格式更為復(fù)雜一點(diǎn),因?yàn)槊啃杏幸粋€(gè)表明行有多長(zhǎng)的頭。當(dāng)一個(gè)記錄因?yàn)楦碌慕Y(jié)果被變得更長(zhǎng),該記錄也可以在超過(guò)一個(gè)位置處結(jié)束。
你可以使用OPTIMIZE TABLE或myisamchk來(lái)對(duì)一個(gè)表整理碎片。如果在一個(gè)表中有你頻繁訪問(wèn)或改變的固定長(zhǎng)度列,表中也有一些可變長(zhǎng)度列,僅為避免碎片而把這些可變長(zhǎng)度列移到其它表可能是一個(gè)好主意。
MySQL數(shù)據(jù)庫(kù)動(dòng)態(tài)格式表的一般特征:
除了長(zhǎng)度少于4的列外,所有的字符串列是動(dòng)態(tài)的。
在每個(gè)記錄前面是一個(gè)位圖,該位圖表明哪一列包含空字符串(對(duì)于字符串列)或者0(對(duì)于數(shù)字列)。注意,這并不包括包含NULL值的列。如果一個(gè)字符列在拖曳空間移除后長(zhǎng)度為零,或者一個(gè)數(shù)字列為零值,這都在位圖中標(biāo)注了且列不被保存到磁盤。 非空字符串被存為一個(gè)長(zhǎng)度字節(jié)加字符串的內(nèi)容。
通常比固定長(zhǎng)度表需要更少的磁盤空間。
每個(gè)記錄僅使用必需大小的空間。盡管如此,如果一個(gè)記錄變大,它就按需要被分開(kāi)成多片,造成記錄碎片的后果。比如,你用擴(kuò)展行長(zhǎng)度的信息更新一行,該行就變得有碎片。在這種情況下,你可以時(shí)不時(shí)運(yùn)行OPTIMIZE TABLE或myisamchk -r來(lái)改善性能??墒褂胢yisamchk -ei來(lái)獲取表的統(tǒng)計(jì)數(shù)據(jù)。
動(dòng)態(tài)格式表在崩潰后要比靜態(tài)格式表更難重建,因?yàn)橐粋€(gè)記錄可能被分為多個(gè)碎片且鏈接(碎片)可能被丟失。
動(dòng)態(tài)尺寸記錄期望的行長(zhǎng)度用下列表達(dá)式來(lái)計(jì)算:
- ·3
- ·+ (number of columns + 7) / 8
- ·+ (number of char columns)
- ·+ (packed size of numeric columns)
- ·+ (length of strings)
- ·+ (number of NULL columns + 7) / 8
對(duì)每個(gè)鏈接需要額外的6字節(jié)。在一個(gè)更新導(dǎo)致一個(gè)記錄的擴(kuò)大之時(shí),一個(gè)動(dòng)態(tài)記錄被鏈接了。每個(gè)新鏈接至少是20字節(jié),所以下一個(gè)擴(kuò)大可能在同樣的鏈接里進(jìn)行。如果不是,則另一個(gè)鏈接將被建立。你可以使用myisamchk -ed來(lái)找出鏈接的數(shù)目。所有的鏈接可以用myisamchk -r來(lái)移除。
以上的相關(guān)內(nèi)容就是對(duì)怎樣掌握MySQL數(shù)據(jù)庫(kù)中動(dòng)態(tài)表特征的介紹,望你能有所收獲。
【編輯推薦】