Mysql:自动递增主键出现重复键错误

Mysql:自动递增主键出现重复键错误,mysql,sql,Mysql,Sql,我有一个表“记录”,我们在其中记录访客历史。我们一天有1400万页面浏览量,所以我们在表中插入1400万条记录,下午的流量最高。从某些时候起,我们就面临着重复键输入'id'的问题,根据我的说法,情况不应该是这样,因为id是自动递增字段,并且没有在插入查询中显式传递id。详情如下: logging (MyISAM) ---------------------------------------- | id | int(20) | | virtual_

我有一个表“记录”,我们在其中记录访客历史。我们一天有1400万页面浏览量,所以我们在表中插入1400万条记录,下午的流量最高。从某些时候起,我们就面临着重复键输入'id'的问题,根据我的说法,情况不应该是这样,因为id是自动递增字段,并且没有在插入查询中显式传递id。详情如下:

logging (MyISAM)
----------------------------------------
| id                 | int(20)         |
| virtual_user_id    | varchar(1000)   |
| visited_page          | varchar(255) |
| /* More such columns are there */    |
----------------------------------------

请告诉我这里有什么问题。在MyISAM中保存表是一个问题。

问题1:主键的大小

一个INT的最大大小是2147483647,而不管您给它的大小是多少,如果不带符号,则是它的两倍。 这意味着你每153天就会遇到一个问题

为了防止出现这种情况,您可能希望将数据类型更改为未签名的bigint。 或者对于更大的卷,甚至是unix时间戳+微时间作为复合密钥。或者完全不同的DB解决方案

问题2:实际错误

这可能是并发性,尽管我觉得这不太可能。 您必须为此提供插入ID/错误。您使用事务处理吗

另一种可能是损坏的表。 不知道您的mysql版本,但这可能有效:

CHECK TABLE tablename
看看有没有什么抱怨

REPAIR TABLE tablename
一般建议:

这是一个合理的数据量插入到一个数据库中,并不是它的速度太慢了吗? 我想知道您的数据库在删除过程中如何执行锁定和所有操作,例如alter table

正确的方法完全取决于系统的目标和要求,我不知道,但这里有一个想法:


将行记录到日志中。在我们自己的时间内导入日志文件。当数据库出现问题或需要执行一些锁定所有内容的大型操作时,不要因为错误或延迟而打扰访问者。

问题1:主键的大小

一个INT的最大大小是2147483647,而不管您给它的大小是多少,如果不带符号,则是它的两倍。 这意味着你每153天就会遇到一个问题

为了防止出现这种情况,您可能希望将数据类型更改为未签名的bigint。 或者对于更大的卷,甚至是unix时间戳+微时间作为复合密钥。或者完全不同的DB解决方案

问题2:实际错误

这可能是并发性,尽管我觉得这不太可能。 您必须为此提供插入ID/错误。您使用事务处理吗

另一种可能是损坏的表。 不知道您的mysql版本,但这可能有效:

CHECK TABLE tablename
看看有没有什么抱怨

REPAIR TABLE tablename
一般建议:

这是一个合理的数据量插入到一个数据库中,并不是它的速度太慢了吗? 我想知道您的数据库在删除过程中如何执行锁定和所有操作,例如alter table

正确的方法完全取决于系统的目标和要求,我不知道,但这里有一个想法:


将行记录到日志中。在我们自己的时间内导入日志文件。当数据库出现问题或需要执行一些锁定所有内容的大型操作时,不要因为错误或延迟而打扰访问者。

问题1:主键的大小

一个INT的最大大小是2147483647,而不管您给它的大小是多少,如果不带符号,则是它的两倍。 这意味着你每153天就会遇到一个问题

为了防止出现这种情况,您可能希望将数据类型更改为未签名的bigint。 或者对于更大的卷,甚至是unix时间戳+微时间作为复合密钥。或者完全不同的DB解决方案

问题2:实际错误

这可能是并发性,尽管我觉得这不太可能。 您必须为此提供插入ID/错误。您使用事务处理吗

另一种可能是损坏的表。 不知道您的mysql版本,但这可能有效:

CHECK TABLE tablename
看看有没有什么抱怨

REPAIR TABLE tablename
一般建议:

这是一个合理的数据量插入到一个数据库中,并不是它的速度太慢了吗? 我想知道您的数据库在删除过程中如何执行锁定和所有操作,例如alter table

正确的方法完全取决于系统的目标和要求,我不知道,但这里有一个想法:


将行记录到日志中。在我们自己的时间内导入日志文件。当数据库出现问题或需要执行一些锁定所有内容的大型操作时,不要因为错误或延迟而打扰访问者。

问题1:主键的大小

一个INT的最大大小是2147483647,而不管您给它的大小是多少,如果不带符号,则是它的两倍。 这意味着你每153天就会遇到一个问题

为了防止出现这种情况,您可能希望将数据类型更改为未签名的bigint。 或者对于更大的卷,甚至是unix时间戳+微时间作为复合密钥。或者完全不同的DB解决方案

问题2:实际错误

这可能是并发性,尽管我觉得这不太可能。 您必须为此提供插入ID/错误。您使用事务处理吗

另一种可能是损坏的表。 不知道您的mysql版本,但这可能有效:

CHECK TABLE tablename
看看有没有什么抱怨

REPAIR TABLE tablename
一般建议:

这是一个合理的数据量插入到一个数据库中,并不是它的速度太慢了吗? 我想知道您的数据库在删除过程中如何执行锁定和所有操作,例如alter table

完全正确的方法