我有一个表'记录',其中我们记录了访客记录。我们一天有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中是一个问题。
答案 0 :(得分:3)
问题1:主键大小
http://dev.mysql.com/doc/refman/5.0/en/integer-types.html
INT的最大大小,无论您给出的大小是2147483647,如果是无符号,则是两倍。 这意味着你每153天就会遇到一个问题。
为了防止您可能希望将数据类型更改为unsigned bigint。 或者对于甚至更加可笑的大卷甚至是unix时间戳+ microtime作为复合键。或者完全不同的数据库解决方案。
问题2:实际错误
它可能是并发性的,即使我没有发现它非常合理。 您必须为此提供插入ID /错误。你使用交易吗?
另一种可能性是腐败的表格。 不知道你的mysql版本,但这可能有效:
CHECK TABLE tablename
看看是否有任何抱怨。
REPAIR TABLE tablename
一般建议:
这是一个合理数量的数据要插入到数据库中,并且它无论如何都不会减慢一切的速度吗? 我想知道你的数据库在锁定期间如何执行锁定,以及在删除期间所有数据库,例如alter table。
完成这项工作的正确方法完全取决于我不了解的系统目标和要求,但这里有一个想法:
将日志行记录到日志中。在我们自己的时间导入日志文件。当您的数据库遇到问题或需要执行一些锁定所有操作的大型操作时,不要让访问者因错误或延迟而烦恼。