MySQL學習筆記之十八 優化之數據類型問題

    一、有效的類型選擇

    1、使你的數據儘可能的小

    最基本的優化之一是使你的數據(和索引)在磁盤上(並且在內存中)佔據的空間儘可能小。這能給出巨大的改進,因爲磁盤讀入較快並且通常也用較少的主存儲器。如果在更小

的列上做索引,索引也佔據較少的資源。

    你能用下面的技術使表的性能更好並且使存儲空間最小:

    (1)儘可能地使用最有效的類型。MySQL有很多節省磁盤空間和內存的專業化類型。

    (2)如果可能使表更小,使用較小的整數類型。例如MEDIUMINT經常比INT好一些。

    (3)如果可能,聲明列爲NOT NULL。它使任何事情更快而且你爲每列節省一位。注意如果在你的應用程序中你確實需要NULL,你應該毫無疑問使用它,只是避免缺省地在所有

列上有它。

    2、使用定長列、而非可變長列

    這條準則對被經常修改,從而容易產生碎片的表來說特別重要。例如,應該選擇CHAR 列而不選擇VARCHAR 列。所要權衡的是使用定長列時,表所佔用的空間更多,但如果

能夠承擔這種空間的耗費,使用定長行將比使用可變長的行處理快得多。

    3、將列定義爲NOT NULL

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

    4、考慮使用ENUM列

    如果有一個只含有限數目的特定值的列,那麼應該考慮將其轉換爲ENUM 列。ENUM 列的值可以更快地處理,因爲它們在內部是以數值表示的。

    二、特殊類型BLOB和TEXT

    1、BLOB和TEXT優點

    用 BLOB 存儲應用程序中包裝或未包裝的數據,有可能使原來需要幾個檢索操作才能完成的數據檢索得以在單個檢索操作中完成。而且還對存儲標準表結構不易表示的數據

或隨時間變化的數據有幫助。

    2、BLOB和TEXT缺點

    另一方面,BLOB 值也有自己的固有問題,特別是在進行大量的DELETE 或UPDATE 操作時更是如此。刪除BLOB 會在表中留下一個大空白,在以後將需用一個記錄或可能是不

同大小的多個記錄來填充。

    除非有必要,否則應避免檢索較大的BLOB 或TEXT 值。例如,除非肯定WHERE 子句能夠將結果恰好限制在所想要的行上,否則SELECT * 查詢不是一個好辦法。這樣做可能

會將非常大的BLOB 值無目的地從網絡上拖過來。這是存儲在另一列中的BLOB 標識信息很有用的另一種情形。可以搜索該列以確定想要的行,然後從限定的行中檢索BLOB 值。

    3、必要的準則

    (1)對容易產生碎片的表使用OPTIMIZE TABLE

    大量進行修改的表,特別是那些含有可變長列的表,容易產生碎片。碎片不好,因爲它在存儲表的磁盤塊中產生不使用的空間。隨着時間的增長,必須讀取更多的塊才能取

到有效的行,從而降低了性能。任意具有可變長行的表都存在這個問題,但這個問題對BLOB 列更爲突出,因爲它們尺寸的變化非常大。經常使用OPTIMIZE TABLE 有助於保持性

能不下降。

    (2)使用多列縮影

    多列索引列有時很有用。一種技術是根據其他列建立一個散列值,並將其存儲在一個獨立的列中,然後可通過搜索散列值找到行。這隻對精確匹配的查詢有效。(散列值對

具有諸如“<”或“>=”這樣的操作符的範圍搜索沒有用處)。在MySQL 3.23版及以上版本中,散列值可利用MD5( ) 函數產生。

    (3)將BLOB值隔離在一個獨立的表中

    在某些情況下,將BLOB 列從表中移出放入另一個副表可能具有一定的意義,條件是移出BLOB 列後可將錶轉換爲定長行格式。這樣會減少主表中的碎片,而且能利用定長行

的性能優勢。

    三、使用ANALYSE過程檢查表列

    ANALYSE([max elements,[max memory]])

    它檢驗來自你的查詢的結果並返回結果的分析。

    max elements(缺省256)是analyse將注意的每列不同值的最大數量。這被ANALYSE用來檢查最佳的列類型是否應該是ENUM類型。

    max memory(缺省8192)是在analyse嘗試尋找所有不同值的時候應該分配給每列的最大內存量。

    SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])

    mysql>SELECT * FROM student PROCEDURE ANALYSE();

    mysql>SELECT * FROM student PROCEDURE ANALYSE(16,256);

    相應輸出中有一列是關於表中每列的最佳列類型的建議。第二個例子要求PROCEDURE ANALYSE( ) 不要建議含有多於16 個值或取多於256 字節的ENUM 類型(可根據需要更

改這些值)。如果沒有這樣的限制,輸出可能會很長;ENUM 的定義也會很難閱讀。

    根據 PROCEDURE ANALYSE( ) 的輸出,會發現可以對錶進行更改以利用更有效的類型。如果希望更改值類型,使用ALTER TABLE 語句即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章