对于那些不是编程问题的选择,它最终是因为我必须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 ...)
答案 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节“其他 功能”。