我想在MySQL中创建一个MyISAM表(尝试了5.0.x和5.1.x的各种版本),该表允许超过2 ^ 32行.实现此目的的方法是使MySQL使用8字节而不是4字节的行指针.
以下是MySQL手册的引文:
If you build MySQL with the –with-big-tables option, the row limitation is increased to 1.844E+19 rows. See Section 2.3.2, “Typical configure Options”. Binary distributions for Unix and Linux are built with this option.
听起来很简单,对吧?但是我尝试了Linux x86_64的各种二进制发行版,并且还使用“ –with-big-tables”选项从源代码构建MySQL.在每种情况下,我仍然无法超过2 ^ 32的限制.我这样创建一个表:
CREATE TABLE big(col int)MAX_ROWS = 1099511627776
当我检查表状态时,它说:
创建选项:max_rows = 4294967295
如何摆脱32位炼狱?使用InnoDB可能会解决问题,但是对于我正在运行的查询类型,它的执行速度要慢得多.
仅供参考,以下是无法解决问题的重要参考:
http://jeremy.zawodny.com/blog/archives/000796.html
解决方法:
我自己解决了这个问题,答案既简单又荒谬.
如果在创建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表中,给定表创建时的myisam_data_pointer_size,最大行数等于(2 ^(8 * myisam_data_pointer_size))-1.
标签:myisam,mysql 来源: https://codeday.me/bug/20191024/1916913.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。