在MySQL中存储搜索引擎记录时处理日期时间的最佳方法?

时间:2014-11-07 05:43:05

标签: mysql

我有一张桌子:

URL | last_crawled | worker_id | worker_assign_date

网址显然是任何网址。 last_crawled是一个日期字段,用于存储上次抓取字段的时间。工作者ID是当前分配给此URL的工作人员的ID。 worker_assign_date是将URL分配给爬网程序的时间。这样,如果工作者X需要花费太长时间来抓取URL,我只会将URL分配给另一个工作人员。

我的问题是,看到我将按工作次数排序很多并且最后抓取了很多,那该类型应该是什么?

首要任务是速度,排序更快? Int或DateTime?

第二优先级是尺寸。 int占用的空间是否比DateTime或更多?

请注意:互联网大约有50亿页。这个数据库将保存所有500万个URL并进行更新等。我将使用InnoDB,因此我只能锁定单行。

更新

一个unix时间戳,它将"工作"到2099年,将是4099770061,因此将其存储为INT(10)将是绰绰有余的。根据mysql documentation,这将占用4个字节。日期时间字段将占用8个字节。所以,似乎时间戳至少更小。这是真的吗?

此外,最后一个问题仍然存在,在排序过程中哪个更快?有什么不同吗?

2 个答案:

答案 0 :(得分:3)

我发现了一篇解决您确切问题的文章。 Int明显更快。这个线程有一个运行性能测试的人,他们非常支持int over datetime。

MySQL Integer vs DateTime index

答案 1 :(得分:2)

分区?

如果这是您在数据库中放置日期的这些边缘情况之一,并且不想在以后做任何事情;然后我会考虑日期,月份,日期,年份等的分区

http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

整数或日期时间?

  • integer是一种更原始​​的类型,不会使用尽可能多的字节。
  • 在32位机器上,比较4个字节比比较8个字节要快。
  • 请记住,解决方案很重要,
    • DATE是3个字节
    • YEAR只有1个字节

做你的作业

根据您的工作量(写密集?读密集?)以及从时间戳到整数的转换,您可能会有一些惊喜。我不相信我在那里看到的数字,并进行我自己的实验,以确保是否符合我的工作量。

http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html http://dev.mysql.com/doc/internals/en/date-and-time-data-type-representation.html


如果您的最终目标是继续抓取您上次抓取时间最久的页面;您可以想象一个环,其中所有行都有一个定期增加的数字,当网址再次被抓取时,您可以将该数字重置为零。

分区,续' d。

如果您使用了分区,并且您知道分区p1具有最早的分区。

SELECT URL FROM mytable PARTITION (p1);
# crawl those.

下次,假设p2拥有最早的数据。

SELECT URL FROM mytable PARTITION (p2);
# crawl those.

繁荣,无需订购或排序。

如何选择一个好的分区方案。

50亿页是很多。您不会在一天内抓取它(或者我希望您不使用拨号)。如果你的移动窗口是一周,那么一年大约有52周;每周你都会得到一个新的工作集。

http://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html

相关问题