2008-09-29 20 views
44

MySQL根據列數據類型將表格的行格式指定爲固定或動態。如果表格具有可變長度的列數據類型(如TEXT或VARCHAR),則行格式爲動態;否則,它是固定的。MySQL行格式:固定和動態之間的區別?

我的問題是,這兩種行格式有什麼區別?比另一個更有效率嗎?

回答

54

這個區別真的只對MyISAM很重要,其他存儲引擎不關心它們之間的區別。 編輯:很多網友評論說,InnoDB執行護理:link 1 by steampoweredlink 2 by Kaan

與固定寬度行MyISAM數據,有幾個優勢:

  1. 沒有行碎片:這是可能的可變寬度行獲得單行分成整個數據文件的多個部分。這可能會增加磁盤搜索速度並降低操作速度。可以使用OPTIMIZE TABLE對其進行碎片整理,但這並不總是實用。

  2. 數據文件指針大小:在MyISAM的,存在其中使用時,它需要以引用數據文件的數據文件的指針的一個概念。例如,當它們引用行實際存在的位置時,這用於索引。對於固定的寬度大小,該指針基於文件中的行偏移量(即,不管大小如何,行都是1,2,3)。使用可變寬度時,指針基於字節偏移(即行可能爲1,57,163)。結果是,對於大表,指針需要更大,然後可能會給表增加更多的開銷。

  3. 更容易修復在腐敗的情況下。由於每行的大小相同,因此如果MyISAM表損壞,則修復起來要容易得多,因此只會丟失實際上已損壞的數據。在寬度可變的情況下,理論上可能的情況是可變寬度指針變得混亂,這可能會導致數據丟失。

現在固定寬度的主要缺點是浪費了更多的空間。例如,您需要使用CHAR字段而不是VARCHAR字段,因此最終會佔用額外的空間。

通常情況下,格式中不會有太多選擇,因爲它是基於模式規定的。但是,如果您只有幾個varchar或一個blob /文本來嘗試優化,可能是值得的。例如,考慮將唯一的varchar切換爲char,或者將blob分成它自己的表。

你可以閱讀,即使在詳細瞭解此:

http://dev.mysql.com/doc/refman/5.0/en/static-format.html

http://dev.mysql.com/doc/refman/5.0/en/dynamic-format.html

+9

[本頁](http://dev.mysql.com/doc/innodb/1.1/en/innodb-row-format-dynamic.html)表明動態行格式對InnoDB也有重要意義。 – steampowered 2012-02-17 13:08:22

4

固定表示每行的大小完全相同。這意味着如果數據頁上的第三行需要加載,它將完全處於PageHeader + 2 * RowSize,節省一些訪問時間。

爲了找到一個動態記錄的開始,記錄偏移的列表,必須先諮詢,這需要額外的間接。

簡而言之,是的,動態行有輕微的性能下降。不,它不是很大。如果您認爲這將是一個問題,請對其進行測試。

+2

中間段是否爲真?這似乎與接受的答案相矛盾。 (即:指針大小隻是更大,而不是間接的額外級別) – 2011-07-27 14:32:42

10

更新記錄時會出現一個關鍵區別。如果行格式是固定的,則記錄的長度沒有變化。相反,如果行格式是動態的並且新數據導致記錄長度增加,則使用鏈接指向「溢出」數據(即,它被稱爲溢出指針)。

這使表格碎片並且通常會減慢速度。有一個命令進行碎片整理(OPTIMIZE TABLE),這有點緩解了這個問題。