1. 程式人生 > >MySQL表最大能達到多少?

MySQL表最大能達到多少?


InnoDB儲存引擎將InnoDB表儲存在一個表空間內,該表空間可由數個檔案建立。這樣,表的大小就能超過單獨檔案的最大容量。表空間可包括原始磁碟分割槽,從而使得很大的表成為可能。表空間的最大容量為64TB。


在下面的表格中,列出了一些關於作業系統檔案大小限制的示例。這僅是初步指南,並不是最終的。要想了解最新資訊,請參閱關於作業系統的文件。



作業系統


檔案大小限制


Linux 2.2-Intel 32-bit


2GB (LFS: 4GB)


Linux 2.4+


(使用 ext3 檔案系統) 4TB


Solaris 9/10


16TB


NetWare w/NSS 檔案系統


8TB


win32 w/ FAT/FAT32


2GB/4GB


win32 w/ NTFS


2TB(可能更大)


MacOS X w/ HFS+


2TB


 


 


 


 


 


 


在Linux 2.2平臺下,通過使用對ext2檔案系統的大檔案支援(LFS)補丁,可以獲得超過2GB的MyISAM表。在Linux 2.4平臺下,存在針對ReiserFS的補丁,可支援大檔案(高達2TB)。目前釋出的大多數Linux版本均基於2.4核心,包含所有所需的LFS補丁。使用JFS和XFS,petabyte(千兆兆)和更大的檔案也能在Linux上實現。然而,最大可用的檔案容量仍取決於多項因素,其中之一就是用於儲存MySQL表的檔案系統。


關於Linux中LFS的詳細介紹,請參見Andreas Jaeger的“Linux中的大檔案支援”頁面:http://www.suse.de/~aj/linux_lfs.html


Windows使用者請注意: FAT和VFAT (FAT32)不適合MySQL的生產使用。應使用NTFS。


在預設情況下,MySQL建立的MyISAM表允許的最大尺寸為4GB。你可以使用SHOW TABLE STATUS語句或myisamchk -dv tbl_name檢查表的最大尺寸。


1
mysql > show table status like 't_user'
;

如果需要使用大於4GB的MyISAM表(而且你的作業系統支援大檔案),可使用允許AVG_ROW_LENGTHMAX_ROWS選項的CREATE TABLE語句。


建立了表後,也可以使用ALTER TABLE更改這些選項,以增加表的最大允許容量。


以下語句將表的最大容量設成了1000G(1TB)


1
mysql > alter table t_user max_rows = 200000000000 avg_row_length = 50;

處理MyISAM表文件大小的其他方式:


如果你的大表是隻讀的,可使用myisampack壓縮它。myisampack通常能將表壓縮至少50%,因而,從結果上看,可獲得更大的表。此外,myisampack還能將多個表合併為1個表。


MySQL包含一個允許處理MyISAM表集合的MERGE庫,這類MyISAM表具有與單個MERGE表相同的結構。


下面是一個例子:


這是一個儲存天氣的表:


mysql> describe weather; 
 +-----------+--------------+------+-----+------------+-------+ 
 | Field     | Type         | Null | Key | Default    | Extra | 
 +-----------+--------------+------+-----+------------+-------+ 
 | city      | varchar(100) |      | MUL |            |       | 
 | high_temp | tinyint(4)   |      |     | 0          |       | 
 | low_temp  | tinyint(4)   |      |     | 0          |       | 
 | the_date  | date         |      |     | 0000-00-00 |       | 
 +-----------+--------------+------+-----+------------+-------+ 
 4 rows in set (0.01 sec)

看看它的容量大小限制,我們使用 SHOW TABLE STATUS


mysql> show table status like 'weather' \G 
 *************************** 1. row *************************** 
 Name: weather 
 Type: MyISAM 
 Row_format: Dynamic 
 Rows: 0 
 Avg_row_length: 0 
 Data_length: 0 
 Max_data_length: 4294967295 
 Index_length: 1024 
 Data_free: 0 
 Auto_increment: NULL 
 Create_time: 2003-03-03 00:43:43 
 Update_time: 2003-03-03 00:43:43 
 Check_time: 2003-06-14 15:11:21 
 Create_options: 
 Comment: 
 1 row in set (0.00 sec)

注意 Max_data_length 為4GB. 我們把它改大:


mysql> alter table weather max_rows = 200000000000 avg_row_length = 50; 
 Query OK, 0 rows affected (0.03 sec) 
 Records: 0  Duplicates: 0  Warnings: 0 
 mysql> show table status like 'weather' \G 
 *************************** 1. row *************************** 
 Name: weather 
 Type: MyISAM 
 Row_format: Dynamic 
 Rows: 0 
 Avg_row_length: 0 
 Data_length: 0 
 Max_data_length: 1099511627775 
 Index_length: 1024 
 Data_free: 0 
 Auto_increment: NULL 
 Create_time: 2003-06-17 13:12:49 
 Update_time: 2003-06-17 13:12:49 
 Check_time: NULL 
 Create_options: max_rows=4294967295 avg_row_length=50 
 Comment: 
 1 row in set (0.00 sec)

現在的表可以儲存更多的內容了.


是否行數太多?


修改容量後,你會發現(上面例子)Create_options 中多了最大行數的限制4294967295,是的,它仍然有一定的限制,但現在的限制是行數,並不是表的容量大小了。也就是說你的最大行數不能超過4294967295.


為什麼?


因為系統是32位,如果你移到64位的系統裡,這個行數限制就會增加.