溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中有哪些列類型

發(fā)布時間:2021-08-05 15:24:58 來源:億速云 閱讀:88 作者:Leah 欄目:數(shù)據(jù)庫

MySQL中有哪些列類型,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

  MySQL列類型選擇和查詢效率有怎樣的聯(lián)系

  ■使用定長列,不使用可變長列。這條準則對被經(jīng)常修改,從而容易產(chǎn)生碎片的表來說特別重要。例如,應該選擇CHAR列而不選擇VARCHAR列。所要權衡的是使用定長列時,表所占用的空間更多,但如果能夠承擔這種空間的耗費,使用定長行將比使用可變長的行處理快得多。

  ■在較短的列能夠滿足要求時不要使用較長的列。如果正使用的是定長的CHAR列,應該使它們盡量短。如果列中所存儲的最長值為40個字符,那么就不要將其定義為CHAR(255);只要定義為CHAR(40)即可。如果能夠使用MEDIUMINT而不是BIGINT,表將會更小(磁盤I/O也較少),其值在計算中也可以處理得更快。

  ■將列定義為NOTNULL。這樣處理更快,所需空間更少。而且有時還能簡化查詢,因為不需要檢查是否存在特例NULL。

  ■考慮使用ENUM列。如果有一個只含有限數(shù)目的特定值的列,那么應該考慮將其轉換為ENUM列。ENUM列的值可以更快地處理,因為它們在內部是以數(shù)值表示的。

  ■使用PROCEDUREANALYSE()。如果使用的是MySQL3.23或更新的版本,應該執(zhí)行PROCEDUREANALYSE(),查看它所提供的關于表中列的信息:

  相應輸出中有一列是關于表中每列的最佳列類型的建議。第二個例子要求PROCEDUREANALYSE()不要建議含有多于16個值或取多于256字節(jié)的ENUM類型(可根據(jù)需要更改這些值)。如果沒有這樣的限制,輸出可能會很長;ENUM的定義也會很難閱讀。根據(jù)PROCEDUREANALYSE()的輸出,會發(fā)現(xiàn)可以對表進行更改以利用更有效的類型。如果希望更改值類型,使用ALTERTABLE語句即可。

  MySQL列類型選擇和查詢效率有怎樣的聯(lián)系

  ■將數(shù)據(jù)裝入BLOB。用BLOB存儲應用程序中包裝或未包裝的數(shù)據(jù),有可能使原來需要幾個檢索操作才能完成的數(shù)據(jù)檢索得以在單個檢索操作中完成。而且還對存儲標準表結構不易表示的數(shù)據(jù)或隨時間變化的數(shù)據(jù)有幫助。在第3章ALTERTABLE語句的介紹中,有一個例子處理存儲來自Web問卷的結果的表。該例子中討論了在問卷中增加問題時,怎樣利用ALTERTABLE向該表追加列。

  解決該問題的另一個方法是讓處理Web的應用程序將數(shù)據(jù)包裝成某種數(shù)據(jù)結構,然后將其插入單個BLOB列。這樣會增加應用程序對數(shù)據(jù)進行解碼的開銷(而且從表中檢索出記錄后要對其進行編碼),但是簡化了表的結構,并且不用在更改問卷時對表進行更改。另一方面,BLOB值也有自己的固有問題,特別是在進行大量的DELETE或UPDATE操作時更是如此。刪除BLOB會在表中留下一個大空白,在以后將需用一個記錄或可能是不同大小的多個記錄來填充。

  ■對容易產(chǎn)生碎片的表使用OPTIMIZETABLE。大量進行修改的表,特別是那些含有可變長列的表,容易產(chǎn)生碎片。碎片不好,因為它在存儲表的磁盤塊中產(chǎn)生不使用的空間。隨著時間的增長,必須讀取更多的塊才能取到有效的行,從而降低了性能。任意具有可變長行的表都存在這個問題,但這個問題對BLOB列更為突出,因為它們尺寸的變化非常大。經(jīng)常使用OPTIMIZETABLE有助于保持性能不下降。

  ■使用合成索引。合成索引列有時很有用。一種技術是根據(jù)其他列建立一個散列值,并將其存儲在一個獨立的列中,然后可通過搜索散列值找到行。這只對精確匹配的查詢有效。(散列值對具有諸如“<”或“>=”這樣的操作符的范圍搜索沒有用處)。在MySQL3.23版及以上版本中,散列值可利用MD5()函數(shù)產(chǎn)生。散列索引對BLOB列特別有用。有一事要注意,在MySQL3.23.2以前的版本中,不能索引BLOB類型。甚至是在3.23.2或更新的版本中,利用散列值作為標識值來查找BLOB值也比搜索BLOB列本身更快。

  ■除非有必要,否則應避免檢索較大的BLOB或TEXT值。例如,除非肯定WHERE子句能夠將結果恰好限制在所想要的行上,否則SELECT*查詢不是一個好辦法。這樣做可能會將非常大的BLOB值無目的地從網(wǎng)絡上拖過來。這是存儲在另一列中的BLOB標識信息很有用的另一種情形??梢运阉髟摿幸源_定想要的行,然后從限定的行中檢索BLOB值。

  ■將BLOB值隔離在一個獨立的表中。在某些情況下,將BLOB列從表中移出放入另一個副表可能具有一定的意義,條件是移出BLOB列后可將表轉換為定長行格式。這樣會減少主表中的碎片,而且能利用定長行的性能優(yōu)勢。

看完上述內容,你們掌握MySQL中有哪些列類型的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI