2014-04-03 96 views
0

我有一个表'日志'其中我们记录访客的历史。我们每天有一千四百万次综合浏览量,所以我们一天内在表中插入1400万条记录,下午流量最高。从那些日子她念叨我们所面临的问题,为重复键输入“身份证”,而据我不应该是这样,因为ID是自动递增场,我们没有明确传递ID在插入查询。以下是详细信息Mysql:与主键自动增量重复键错误

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

请让我知道这里有什么问题。在MyISAM中保留表格是一个问题。

+2

你在桌子上还有什么独特的钥匙?你在桌上有触发器吗? –

+1

并发查询可能是你的情况(所以你需要发布更多的细节|) –

+1

目前表中最大的ID是什么(SELECT MAX(id)FROM logging)? –

回答

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。

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

日志行到日志。在我们自己的时间导入日志文件。当数据库遇到问题或者需要做一些可以锁定所有内容的大型操作时,请不要打扰访问者的错误或延迟。

+0

记录数量绝不应该是一个问题(至少不是这个数量)。已经在每分钟记录+50.000个插入记录的网站上正常运行,mysql也是如此。 OP应该考虑1)我真的需要一个autoincremental id吗?有什么好处,是不是我们需要的时间戳? 2)我是否需要不断地写db数据?出于什么目的。为什么不使用简单的日志文件,对其进行刷新并使脚本每天一次将记录插入数据库日志表中,每小时一次或类似? – davidkonrad

+0

根据我的经验(每天〜2M日志条目,10k平均行大小)MyISAM表现非常好。我没有遇到任何并发/锁定或性能问题。目前唯一的问题是有足够的磁盘空间... – Vatev

+0

我看到另一个SO问题,提问者竟然有另一个脚本,做了一些自动增加逻辑本身造成的麻烦。最大(编号)+ 1.可能不是这种情况,但值得消除的一种可能性... – Arnout