MySQL单一表突破4G限制的实现方法(二)

日期: 2008-10-27 作者:茶晶 来源:TechTarget中国 英文

  经过朋友的开导,了解到单一文件大小有如下几个因素:

  1. 文件系统的限制(如刚存所说EXT3的2TB限制)

  2. 某一程序进程所能存取的第一文件最大尺寸(例如apache在Linux EXT3下能存取的最大尺寸为2G,诸如日志)

  初步判断瓶颈就在上述其中第二项。随后找到myisamchk来显示一下表信息,证明了瓶颈就在MySQL本身的存取上。


 # myisamchk -dv cdb_posts

  结果就不贴了,其中有一项Max datafile length的值恰好就是4G。由此产生了瓶颈。

  后来翻阅了N多资料,进行了N多尝试,也走了不少弯路,最终觉得还是官方文档比较可靠。比较老的文档里写道这是由于tmp_table_size的值造成的,也有提到用BIG-TABLES这个参数。事实证明这些都是歧途。大晚上的确实很累,这里只给出最终的解决方案吧,中间的就不罗嗦了。

  进到mysql客户端。

 


# mysql -uroot -p 
  Enter password: ****** 
  Welcome to the MySQL monitor. Commands end with ; or g. 
  Your MySQL connection id is 59411 to server version: 4.0.18-standard 
  Type ‘help;’ or ‘h’ for help. Type ‘c’ to clear the buffer. 
  mysql> use ****** 
  Database changed 
  mysql> ALTER TABLE cdb_posts MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;


  因为这个表非常大,执行时间在双Athlon的专业服务器上竟然花了30分钟!

  之后再通过myisamchk查看该表的信息:


 # myisamchk -dv cdb_posts 
  MyISAM file: cdb_posts 
  Record format: Packed 
  Character set: latin1 (8) 
  File-version: 1 
  Creation time: 2004-08-30 22:19:48 
  Recover time: 2004-08-30 22:42:47 
  Status: open,changed 
  Auto increment key: 1 Last value: 1063143 
  Data records: 619904 Deleted blocks: 5 
  Datafile parts: 619909 Deleted data: 323872 
  Datafile pointer (bytes): 6 Keyfile pointer (bytes): 4 
  Datafile length: 4295287332 Keyfile length: 40421376 
  Max datafile length: 281474976710654 Max keyfile length: 4398046510079 
  Recordlength: 149 
  table description: 
  Key Start Len Index Type Rec/key Root Blocksize 
  1 1 4 unique unsigned long 1 4535296 1024 
  2 5 2 multip. unsigned short 13776 12540928 1024 
  3 111 4 multip. unsigned long 1 18854912 1024 
  4 28 3 multip. uint24 18 24546304 1024 
  5 7 3 multip. uint24 7 32827392 1024 
  111 4 unsigned long 1 
  6 7 3 multip. uint24 7 40418304 1024 
  28 3 uint24 

  令人振奋的事情发生了,该表的 Max datafile length: 281474976710654 Max keyfile length: 4398046510079,即最大数据尺寸(MYD文件)达到了2TB,最大索引尺寸(MYI)仍然为4G。

  由此默认的4G限制被突破了。关于其中的原理,其实很简单:假设你有一个日记本,上面有10页纸可以写东西,编排目录只需要1个字节(因为0~9就够了)。如果你把这本子又塞进两张纸,变成12页,1个字节的目录空间就无法寻址到后面的两页中,进而产生了错误。上面那个ALTER语句中的数值都是我为保证成功,取的比较大的值(因为ALTER一次实在是太慢了,没时间在那乱试验),相当于告诉数据库,这个本子有1000000000页,每页平均有15000个字节。这样数据库便知道这是很大的一个本子,因此不遗余力的拿出了100页(假设说)做目录编排,这样这个新的目录就可以寻址到日记本的所有内容了。错误消失。

  惟一的缺点就是,目录占用的空间多了一些,但已经微乎其微了,做了这种改变其实4G的文件尺寸大小只增大了1M多,非常令人振奋。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

茶晶
茶晶

相关推荐