2010-07-12 24 views
3

我想在MySQL中創建一個MyISAM表(試用5.0.x和5.1.x的各種版本),它允許超過2^32行。實現這一目標的方法是讓MySQL使用8字節而不是4字節的行指針。在MyISAM表中克服2^32行的MySQL限制

下面是從MySQL手冊報價:

如果你構建MySQL使用--with-大表選項,行限制提高到1.844E + 19行。請參見第2.3.2節「典型配置選項」。 Unix和Linux的二進制發行版使用此選項構建。

聽起來很簡單吧?但我已經嘗試了各種針對Linux x86_64的二進制發行版,並且還使用「--with-big-tables」選項從源代碼構建了MySQL。在任何情況下,我仍然無法超越2^32的限制。我創建一個表像這樣:

CREATE TABLE big (col int) MAX_ROWS=1099511627776

當我檢查表狀態,它說:

Create_options: max_rows=4294967295

如何逃脫的32位煉獄?使用InnoDB可能會解決這個問題,但對於我正在運行的查詢類型,它執行速度要慢得多。

僅供參考,這裏有沒有解決不了問題的重要參考:

http://jeremy.zawodny.com/blog/archives/000796.html

+0

你確定你合法需要這麼多行嗎? – Fosco 2010-07-12 13:55:06

+0

@Fosco:如果他正在處理它,假設他是。 – 2010-07-12 14:05:12

+0

@ the_drow:謝謝你。 – Fosco 2010-07-12 14:49:34

回答

0

如果要編譯使用--with-大表選項的mysql,行限制提高到(2^32)^ 2。不幸的是這是最高的限制:)

+0

但問題是這沒有發生。即使使用該選項進行編譯(在x86_64上,這並不意味着這一點),它仍然保持在2^32。 – Butters 2010-07-12 15:12:47

+0

另一個限制是大小爲256TB,但我不認爲這是你的情況。我從未試圖達到這些限制。我很確定這是一個工程問題,你可以避免這些限制。 – 2010-07-13 08:02:06

5

我爲自己工作了,答案既簡單又荒謬。

如果你在創建MyISAM表時沒有出現 MAX_ROWS設置,那麼該表不會受到行上2^32限制的影響。相反,最大行數由指針大小決定,指針大小本身由全局變量myisam_data_pointer_size決定。

默認情況下,在Linux/Unix上運行的MySQL的現代版本中,myisam_data_pointer_size是6,導致在具有固定行寬的表(或具有動態行的表上的2^48字節)上限制2^48行。但你也可以使用類似更改:

SET GLOBAL myisam_data_pointer_size=5; 

而且使用檢查:

SHOW VARIABLES LIKE 'myisam_data_pointer_size'; 

在固定寬度行MyISAM表,行的最大數量等於(2 ^( 8 * myisam_data_pointer_size)) - 1,在創建表時給出myisam_data_pointer_size。