在mysql数据库中使用日期而不是ID

时间:2014-11-04 16:07:25

标签: mysql date database-performance

如何智能地将日期用作主要值而不是ID?

我可以更好地搜索mysql数据库的性能:

to use timestamp: 1394319600
or to format date and use it as: 09032014 

09032014 = 1394319600 = 9.Mart 2014

1 个答案:

答案 0 :(得分:2)

您可能不应该使用日期时间类型的数据字段作为主键开头。我建议使用自动增量整数字段来保证唯一性。

现在关于datetime / timestamp字段本身,对这些列使用本机日期时间或时间戳数据类型几乎总是更好,而不是字符串表示,如unix时间戳或其他格式化日期字符串。

为什么呢?因为当人们将时间戳数据放入他们的数据库库时,他们通常会想要针对该数据运行查询。如果以非本机日期时间格式存储数据,则通常需要将其转换为这种格式,然后才能在此类查询中使用的典型日期/时间函数中使用它。这通常意味着您无法利用字段上的任何索引进行查询。

例如,假设您要运行查询以查看当天的所有记录。使用unix timestamp字段,查询可能如下所示:

SELECT * FROM table
WHERE FROM_UNIX_TIMESTAMP(timestamp_field)
    BETWEEN CONCAT(CURRENT_DATE(), ' 00:00:00') AND CONCAT(CURRENT_DATE(), ' 23:59:59')

然后提交日期时间/时间戳,它看起来像:

SELECT * FROM table
WHERE timestamp_field
    BETWEEN CONCAT(CURRENT_DATE(), ' 00:00:00') AND CONCAT(CURRENT_DATE(), ' 23:59:59')

这里在第一个查询中在WHERE条件左侧使用FROM_UNIX_TIMESTAMP()的简单要求会阻止使用索引,因为FROM_UNIX_TIMESTAMP(timestamp_field)内存不存在timestamp_field如果索引正确。这意味着您现在需要执行全表扫描来执行该查询。如果你有一张大桌子,这可能会有问题。