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