INSERT与UPDATE:MySQL,700万行

时间:2014-01-31 14:13:50

标签: mysql database

对于那些不是编程问题的选择,它最终是因为我必须1)代码,2)比较选项#1中每行的数据的算法量。 我不是在询问如何设置查询或如何设置数据库

我遇到了一些泡菜。我有一个遵循Google GTFS规范的数据库,我现在正在编写一个自动更新程序来为这个数据库提供服务。

数据库每3个月进行一次大修。行数最少的表由1-10行组成,最大的表包含7百万行。其余的在10 000到8 000之间。

我要下载的程序文件是.txt文件,它们在表格中翻译。换句话说:stops.txt = database.stops。数据库是InnoDB类型。

我想出了两个解决方案。

  • 1)将几个.txt文档中的每一行ID与数据库中当前的内容进行比较,如果没有任何更改的话 什么都没有,如果有什么变化,请做一个更新。

  • 2)将下载的文件插入到自己的表中(基本上镜像实时表),然后切换表名。例: database.stop_new和database.stop开关名称。

另一个转折点:大修将在其中一个.txt文件中定义的特定日期完成,这意味着它可以在高峰假期前的星期六完成,这意味着用户可以随时发送查询。 / p>

问题:我应该采用哪种方法来确保没有任何损失,并维护用户体验。 (我倾向于选择2 ...)

2 个答案:

答案 0 :(得分:2)

很大程度上取决于更新量。如果只有10个记录在700万个中有变化,那么进行更新可能是合理的。

但是,我想提倡第二种方法。或者,或许,对于第二种方法的变化。

首先,确定哪些记录相同以及哪些记录已更改是很多工作。这可能意味着将所有数据下载到表中,运行复杂查询以查找更改,然后更新表以执行更新。这是很多处理开销。

第二种方法是下载数据。以正确的格式获取表。然后切换。对于交换机,我会锁定表以防止其他连接使用它们,重命名表,然后解锁所有内容。这应该需要几秒钟。

如果您可以处理几分钟的停机时间,则可能需要截断现有表,然后将新数据插入其中。这样做的好处是可以保留安全访问,索引,触发器和有关表的其他信息。

答案 1 :(得分:1)

根据MySQL文档...

  

MySQL对MyISAM,MEMORY和MERGE表使用表级锁定,   BDB表的页级锁定和InnoDB的行级锁定   表。

您将能够对表进行行级锁定,而不是使整个内容无法使用...

  

表更新的优先级高于表检索。

更新优先于选择,并且也基于键值,所以我认为这将是一个更好的选择。

<强>&GT;行级锁定的优点:

  

当不同的会话访问不同的行时,锁定冲突会减少

     

回滚的更改次数较少

     

可以长时间锁定单行

<强>&GT;行级锁定的缺点:

  

需要比页面级或表级锁更多的内存

     

在大型部件上使用时,比页级或表级锁慢   因为你必须获得更多的锁

     

如果你经常对一个大型的GROUP BY操作,那么比其他锁更慢   部分数据或者您必须经常扫描整个表

但是,根据MySQL文档......通常,表锁优于行级锁...

另一种选择......

  

您可以使用应用程序级别,而不是使用行级锁   锁,例如由GET_LOCK()和RELEASE_LOCK()提供的锁   MySQL的。这些是咨询锁,因此它们仅适用于应用程序   相互合作。请参见第12.14节“其他   功能”。