時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
要選擇有助于使查詢執(zhí)行更快的列,應(yīng)遵循如下規(guī)則(這里,"BLOB 類型"應(yīng)該理解為即包含B L O B也包含TEXT 類型):
使用定長列,不使用可變長列。這條準(zhǔn)則對被經(jīng)常修改,從而容易產(chǎn)生碎片的表來說特別重要。例如,應(yīng)該選擇CHAR 列而不選擇VARCHAR 列。所要權(quán)衡的是使用定長列時,表所占用的空間更多,但如果能夠承擔(dān)這種空間的耗費,使用定長行將比使用可變長的行處理快得多。
在較短的列能夠滿足要求時不要使用較長的列。如果正使用的是定長的CHAR 列,應(yīng)該使它們盡量短。如果列中所存儲的最長值為40 個字符,那么就不要將其定義為CHAR ( 2 5 5 );只要定義為CHAR(40) 即可。如果能夠使用MEDIUMINT 而不是BIGINT,表將會更小(磁盤I/O 也較少),其值在計算中也可以處理得更快。
將列定義為NOT NULL。這樣處理更快,所需空間更少。而且有時還能簡化查詢,因為不需要檢查是否存在特例NULL。
考慮使用ENUM 列。如果有一個只含有限數(shù)目的特定值的列,那么應(yīng)該考慮將其轉(zhuǎn)換為ENUM 列。ENUM 列的值可以更快地處理,因為它們在內(nèi)部是以數(shù)值表示的。
使用PROCEDURE ANALYSE( )。如果使用的是MySQL3.23 或更新的版本,應(yīng)該執(zhí)行PROCEDURE ANALYSE( ),查看它所提供的關(guān)于表中列的信息:
相應(yīng)輸出中有一列是關(guān)于表中每列的最佳列類型的建議。第二個例子要求PROCEDURE ANALYSE( ) 不要建議含有多于16 個值或取多于256 字節(jié)的ENUM 類型(可根據(jù)需要更改這些值)。如果沒有這樣的限制,輸出可能會很長;ENUM 的定義也會很難閱讀。根據(jù)PROCEDURE ANALYSE( ) 的輸出,會發(fā)現(xiàn)可以對表進(jìn)行更改以利用更有效的類型。如果希望更改值類型,使用ALTER TABLE 語句即可。
將數(shù)據(jù)裝入B L O B。用BLOB 存儲應(yīng)用程序中包裝或未包裝的數(shù)據(jù),有可能使原來需要幾個檢索操作才能完成的數(shù)據(jù)檢索得以在單個檢索操作中完成。而且還對存儲標(biāo)準(zhǔn)表結(jié)構(gòu)不易表示的數(shù)據(jù)或隨時間變化的數(shù)據(jù)有幫助。在第3 章ALTER TABLE 語句的介紹中,有一個例子處理存儲來自Web 問卷的結(jié)果的表。該例子中討論了在問卷中增加問題時,怎樣利用ALTER TABLE 向該表追加列。
解決該問題的另一個方法是讓處理Web 的應(yīng)用程序?qū)?shù)據(jù)包裝成某種數(shù)據(jù)結(jié)構(gòu),然后將其插入單個BLOB 列。這樣會增加應(yīng)用程序?qū)?shù)據(jù)進(jìn)行解碼的開銷(而且從表中檢索出記錄后要對其進(jìn)行編碼),但是簡化了表的結(jié)構(gòu),并且不用在更改問卷時對表進(jìn)行更改。另一方面, BLOB 值也有自己的固有問題,特別是在進(jìn)行大量的DELETE 或UPDATE 操作時更是如此。刪除BLOB 會在表中留下一個大空白,在以后將需用一個記錄或可能是不同大小的多個記錄來填充。
對容易產(chǎn)生碎片的表使用OPTIMIZE TABLE。大量進(jìn)行修改的表,特別是那些含有可變長列的表,容易產(chǎn)生碎片。碎片不好,因為它在存儲表的磁盤塊中產(chǎn)生不使用的空間。隨著時間的增長,必須讀取更多的塊才能取到有效的行,從而降低了性能。任意具有可變長行的表都存在這個問題,但這個問題對BLOB 列更為突出,因為它們尺寸的變化非常大。經(jīng)常使用OPTIMIZE TABLE 有助于保持性能不下降。
使用合成索引。合成索引列有時很有用。一種技術(shù)是根據(jù)其他列建立一個散列值,并將其存儲在一個獨立的列中,然后可通過搜索散列值找到行。這只對精確匹配的查詢有效。(散列值對具有諸如" <"或" > ="這樣的操作符的范圍搜索沒有用處)。在MySQL3.23版及以上版本中,散列值可利用MD5( ) 函數(shù)產(chǎn)生。散列索引對BLOB 列特別有用。有一事要注意,在MySQL3.23.2 以前的版本中,不能索引BLOB 類型。甚至是在3.23.2 或更新的版本中,利用散列值作為標(biāo)識值來查找BLOB 值也比搜索BLOB 列本身更快。
除非有必要,否則應(yīng)避免檢索較大的BLOB 或TEXT 值。例如,除非肯定WHERE 子句能夠?qū)⒔Y(jié)果恰好限制在所想要的行上,否則SELECT * 查詢不是一個好辦法。這樣做可能會將非常大的BLOB 值無目的地從網(wǎng)絡(luò)上拖過來。這是存儲在另一列中的BLOB 標(biāo)識信息很有用的另一種情形??梢运阉髟摿幸源_定想要的行,然后從限定的行中檢索BLOB 值。
將BLOB 值隔離在一個獨立的表中。在某些情況下,將BLOB 列從表中移出放入另一個副表可能具有一定的意義,條件是移出BLOB 列后可將表轉(zhuǎn)換為定長行格式。這樣會減少主表中的碎片,而且能利用定長行的性能優(yōu)勢。
關(guān)鍵詞標(biāo)簽:MySQL
相關(guān)閱讀
熱門文章
Xbox Game Pass
10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦
MySQL常用維護(hù)管理工具
MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié)
人氣排行 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦 MySQL數(shù)據(jù)庫啟動失敗1067進(jìn)程意外終止的解決辦法總結(jié) Mysql 1045錯誤解決辦法 MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法 MySQL導(dǎo)出導(dǎo)入命令的用例 MySQL連接字符串的實際操作步驟匯總 MySQL無法啟動、無法停止各種解決方法總結(jié) 三種常用的MySQL建表語句