字符串/日期比较或插入替换在数据库中更快吗?

时间:2014-10-12 19:37:53

标签: mysql ruby-on-rails ruby sqlite

问题

我有一个数据库(SQLite或MySQL),在过去几年中每天都有降雨量值。这很简单:

 date          | rain
------------------------
"2014-10-20"     3.3

每天,我从当地气象局提取CSV文件。他们只发布包含全年数据的CSV文件,没有每日/每周/等等文件,因此到今年年底,文件中有365行。在每一行中,日期分为年,月和日字段。

因此,当需要将信息存储在数据库中时,我有两个选择。

解决方案1:进行日期比较

我会在数据库或文本文件中保存上次运行程序的日期。我使用Date.strptime解析该日期并将其存储为last_run_time。然后我用CSV.read('raindata.csv').each do |row|加载CSV文件,对于每一行,我将三个日期字段解析为rowdate = Date.strptime("#row[2]}-#{row[3]}-#{row[4]}")的新Date对象,并说if rowdate > last_run_time then将信息插入数据库。

这样,我就避免对我已有的插入或替换值进行数据库调用。到今年年底,这使我省了364个数据库查询,但这意味着我做了很多日期解析和比较。

解决方案2:让数据库处理它

我会避免所有这些,只需对CSV中的每一行说出,插入或忽略到数据库中。数据库中的日期字段是唯一的,因此如果我尝试插入但已经有日期,则只会忽略查询。 Pro:避免进行日期比较和解析,con:对数据库进行多达364次不必要的点击。

问题

这两种解决方案中哪一种更智能,更高效,更加资源友好?是否更好地进行不必要的数据库查询并节省CPU,或者副verca?

2 个答案:

答案 0 :(得分:-1)

数据库句柄是最重的操作,无论哪种解决方案具有较少的查询次数都是最佳方法。

解析和语言功能的复杂性要小得多..因此语言和较少查询的过程输入

答案 1 :(得分:-1)

与比较日期相比,点击数据库可能会扩展1,000或1,000,000倍。话虽如此,但没有区别,因为对于任何实际目的而言,每天对数据库进行364次点击被视为零负载。

如果您需要更新脚本尽快运行,请进行日期比较。你冒的是会有一些错误的风险,将来可能会错过一些数据。

如果您有额外的几秒钟,并且您最关心数据完整性和简单性,请每天更新整个事情。