mysql中資料類型最佳化方法詳解

伊谢尔伦
發布: 2017-06-28 14:14:18
原創
1166 人瀏覽過

這篇文章主要介紹了MySQL中資料型別相關的最佳化方法,包括使用多列索引等相關的最佳化方法,需要的朋友可以參考下

#有助於效率的類型選擇

1、讓你的資料盡可能小

最基本的最佳化之一是讓你的資料(和索引)在磁碟上(並且在記憶體中)佔據的空間盡可能小。這能給予巨大的改進,因為磁碟讀入較快並且通常也使用較少的主記憶體。如果在較小的欄位上做索引,索引也佔據較少的資源。

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

·盡可能地使用最有效(最小)的類型。 MySQL有很多節省磁碟空間和記憶體的專業化類型。

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

·如果可能,則宣告列為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、必要的準則

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

使用多列索引

多列索引列有時很有用。一種技術是根據其他列建立一個雜湊值,並將其儲存在一個獨立的列中,然後可透過搜尋雜湊值找到行。這只對精確匹配的查詢有 效。 (雜湊值對具有諸如“<”或“>=”這樣的操作符的範圍搜尋沒有用處)。在MySQL 3.23版以上版本中,雜湊值可利用 MD5( ) 函數產生。散列索引對 BLOB 列特別有用。有一事要注意,在 MySQL 3.23.2 以前的版本中,不能索引 BLOB 類型。甚至在 3.23.2 或更新的版本中,利用雜湊值作為識別值來尋找 BLOB 值也比搜尋 BLOB 列本身更快。

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

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

使用ANALYSE程序檢查表列
如果使用的是MySQL 3.23 或更新的版本,應該執行PROCEDURE 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 語句即可。

以上是mysql中資料類型最佳化方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!