2011-04-27 37 views
2

由於MyISAM在表上具有可變長度列(varchar,blob),所以真正減慢了查詢速度,因此我在網絡上遇到了將varchar列移動到單獨表中的建議。在InnoDB表上有很長的變長列嗎?

這仍然是InnoDB的問題嗎?我不是指向表中引入多個varchar行會導致頁面拆分的情況。我的意思是,你應該考慮,例如,將post_text(表中的單個BLOB字段)移動到另一個表中,對InnoDB進行性能方面的表達?

回答

2

據我所知,BLOBs(和TEXTs)實際上存儲在表的外部,VARCHARs存儲在表中。

VARCHAR對讀取性能不利,因爲每條記錄的長度都是可變的,這使得查找記錄中的字段成本更高。 BLOB速度很慢,因爲必須單獨提取值,並且很可能需要從磁盤或緩存中進行另一次讀取。

據我所知,InnoDB在這方面沒有做任何不同的事情,所以我會假設性能特徵持有。

我不認爲移動BLOB值真的有幫助 - 除了減少對性能有積極影響的整體表大小。 VARCHAR是一個不同的故事。你一定會從中受益。如果所有列的長度都已定義(我想這意味着您無法使用BLOB),那麼字段查找將會更快。

如果你只是'閱讀'VARHCAR和BLOB字段,我會說這值得一試。但是,如果您的選擇查詢需要比較來自VARCHAR或BLOB的值,那麼您會感覺很不好。

所以,你絕對可以在這裏獲得性能,但要確保你測試你實際上獲得了性能,並且這種增加值得進行積極的非規範化。

PS。

'優化'VARCHAR讀取性能的另一種方法是簡單地用CHAR字段(固定長度)替換它們。只要磁盤空間的增加是可以接受的,這可能有利於讀取性能。

+0

據我所知,可以建議保持BLOB列在表中的最後一個,如果BLOBs很少被查詢。這將允許保持固定長度行表的性能。 – 2011-04-28 07:25:43

+0

這個問題來自不久前,但我相信接受的答案在幾點上是不正確的。詳情請參閱我的回答。 – 2012-12-04 22:48:48

2

InnoDB數據與MyISAM完全不同。

在MyISAM中,所有索引 - 主要或其他 - 都存儲在MYI文件中,包含一個指向存儲在MYD文件中的數據的指針。可變長度的行不應該直接影響查詢速度,但MYD文件確實傾向於使用可變長度的行來獲得更多的碎片,因爲刪除行時留下的空洞不一定要歸入下一行插入的行。如果更新可變長度值以使其更長,則可能需要將其移動到其他位置,這意味着隨着時間的推移,它將傾向於與索引無序,從而使得範圍查詢更慢。 (如果你在尋找時間很重要的旋轉磁盤上運行它)。

InnoDB將數據聚集在主鍵上的B樹中的頁面中。只要數據適合頁面,它就存儲在頁面中,無論您使用的是BLOB還是VARCHAR。只要你不是試圖定期插入非常長的值,你的行是固定長度還是可變長度都沒關係。