【发布时间】:2015-01-03 20:48:53
【问题描述】:
我有一张桌子:
URL | last_crawled | worker_id | worker_assign_date
url 显然是任何 url。 last_crawled 是一个日期字段,用于存储上次抓取该字段的时间。工作人员 ID 是当前分配给此 URL 的工作人员的 ID。 worker_assign_date 是 URL 分配给爬虫的时间。这样一来,如果 worker X 抓取 URL 的时间过长,我只会将该 URL 分配回另一个 worker。
我的问题是,由于我将大量按 worker_assign_date 和 last_crawled 进行排序,该类型应该是什么?
第一要务是速度,哪个排序更快?整数还是日期时间?
第二个优先级是大小。 int 占用的空间是否比 DateTime 少或更多?
请注意:互联网大约有 50 亿页。该数据库将保存所有 500 万个 URL 并进行更新等。我将使用 InnoDB,因此我只能锁定单行。
更新
在 2099 年之前“工作”的 unix 时间戳将是 4099770061,因此将其存储为 INT(10) 就足够了。根据 mysql documentation,这将占用 4 个字节。一个日期时间字段将占用 8 个字节。因此,似乎时间戳至少更小。这是真的吗?
此外,最后一个问题仍然存在,在排序过程中哪个更快?有什么区别吗?
【问题讨论】:
-
嘿@coderama,我强烈推荐日期时间。我公司的 DBA 推荐它,我们维护一个大型的 mySQL 堆栈。另外,请参考这篇 stackoverflow 文章:stackoverflow.com/questions/12617347/…
-
谢谢,但基于什么理由。我不会使用任何日期函数。纯粹是为了订购。我已经确定日期时间更大,但它是更慢还是更快?如果我不需要使用所有额外的 mysql 功能,我为什么要使用两者中更大更慢的?
-
如果只是为了订购,我同意 int 会更好。但是,您可能还需要考虑您的数据库将来将用于什么。您现在可能不需要日期函数,但您的数据存储不可避免地会变得更大,并且您会想要报告该数据。如果你能在这种情况下利用 mySQL 的日期函数,会容易很多。
-
如果您正在构建某种网络爬虫,我认为尤其如此。一个 URL 的一个数据库行将加起来 FAST。
-
太棒了。有什么想法可以更快地排序吗?我认为 int,因为它更小,但也许我不知道 date_time 有一些好处?
标签: mysql