MySQL自增主键用完报什么错?有什么建议?

MySQL自增主键用完报什么错?有什么建议?,第1张

我们首先通过代码输出Integer和Long最大值:

abc可以正确插入数据表,但是插入d时报错:

主键ID改为无符号int类型后abcd全部可以正确插入:

abc可以正确插入数据表,但是插入d时报错:

主键ID改为无符号Long类型后abcd全部可以正确插入:

如果希望单表可以存储尽可能多的数据,选择主键类型时Long优先于Int,无符号优先于有符号。

阿里巴巴开发手册建议:单表行数超过500万行或者单表容量超过2GB才推荐进行分库分表,如果预计三年后数据量根本达不到这个级别,请不要在创建表时就分库分表。

在业务初期可能并不用分库分表,但是随着业务发展,当单表记录数超过一定数量时就可以考虑分库分表,而不是等到自增主键用完时再分库分表,因为即使以有符号Int主键值上限分析,单表21亿数据也太多了。

分库分表原理与实际应用请参看笔者的两篇文章:

长文多图:一文讲清楚应对单数据表海量数据的六种策略

多图详解:如何不停服分库分表

这种情况是,刚好存储那几个id的磁盘地址坏了。

可以尝试:

1.如果是innodb引擎,ALTER TABLE table_name ENGINE=INNODB

如果是myisam引擎,OPTIMIZE TABLE table_name

之后,再试试能否查到。

2.如果还不行,备份这张表,然后DROP TABLE table_name然后恢复。

主键是一个索引,mysql的索引是B+树,Mysql会按照键值的大小进行顺序存放,如果我们设置自增id为主键,这个时候主键是按照一种紧凑的接近顺序写入的方式进行存储数据。如果我们用其他字段作为主键的话,此时Mysql不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多额外的开销,同时频繁的移动、分页 *** 作造成了大量的碎片。

- 考虑性能消耗

- 考虑资源消耗

- 考虑分库分表


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7420522.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存