【问题标题】:Is it faster to do string/date comparisons, or to insert-replace in the database?进行字符串/日期比较或在数据库中插入替换是否更快?
【发布时间】:2014-10-12 19:37:53
【问题描述】:

问题

我有一个数据库(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 次数据库查询,但这意味着我做了很多日期解析和比较。

方案二:让数据库处理就行了

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

问题

这两种解决方案中哪一种更智能、更高效、更节省资源?进行不必要的数据库查询并节省 CPU 是否更好,反之亦然?

【问题讨论】:

  • 为了节省 0.1 秒的 CPU 时间,你愿意牺牲多少编程时间?

标签: mysql ruby-on-rails ruby sqlite


【解决方案1】:

数据库句柄是最繁重的操作,无论哪种解决方案的查询数量较少,都是最好的方法。

解析和语言函数的复杂性要低得多。所以处理语言输入和较少的查询

【讨论】:

    【解决方案2】:

    访问数据库可能比比较日期要广泛 1,000 或 1,000,000 倍。话虽如此,但这并没有什么区别,因为对于任何实际目的,每天对数据库进行 364 次点击都被认为是零负载。

    如果您需要尽可能快地运行更新脚本,请进行日期比较。您冒着可能会出现一些错误的风险,并且将来某个时候可能会丢失一些数据。

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

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 1970-01-01
      相关资源
      最近更新 更多