在mysql表中存储大型自定义订单ID的方法

时间:2013-12-05 19:47:17

标签: mysql

我正在考虑订购ID 31012090134

其中第一位3代表年份的最后一位数,即2013年

接下来的2位10表示月份,即10月

下一个2位12表示月份日期

接下来的2位09表示一天中的小时,即早上9点

其余4位数字只是特定小时内的增量数字。

我使用MySQL作为数据库引擎,但我不确定将其存储到数据库中的完美方式是什么,可以在需要时快速检索它。我不希望客户等待3-4秒等待加载订单跟踪页面,因为系统正忙着从DB中查找特定的订单ID。考虑到mysql中INT数据类型的大小,我不认为我可以使用它。通过Varchar搜索似乎不对。 Bigint是一个看起来不错的选项,但现在肯定了。

我想到的是根据它们代表的值将它分成多个表。但由于我也在同一个表中使用order_creation_time作为列,我也可以使用它来缩小到特定日期并在最后4位数字上进行选择查询。

你能建议一个好方法吗?或者这个订单号命名模式是否有任何错误?

5 个答案:

答案 0 :(得分:2)

如果您真的想要这种方法,那么您可以执行以下操作:

  • 使用DATETIME字段来保存日期和小时字段,请记住始终将分钟和秒设置为零。
  • 使用INT字段存储每日订单ID。

然后,为了确保您始终拥有唯一数据,您需要:

  • 在DATETIME和INT字段上有一个UNIQUE键。喜欢:UNIQUE_KEY(datetimeField, intField)

但这确实意味着您的应用程序必须跟踪获取唯一每日订单ID所需的逻辑。如果您愿意,也可以在MySQL PROCEDUREsFUNCTIONTRIGGER中完成此操作。

<强>更新
我在您的评论中读到,似乎只想向您的用户显示此自定义订单ID,并在应用程序逻辑中使用它。

如果是这种情况,那么最合乎逻辑的选项是:

  • BIGINT:优势在于您可以利用索引。
  • VARCHAR:优势在于您无需担心BIGINT的大小。

答案 1 :(得分:2)

varchar肯定,这就是原因:

  • bigint更适合搜索,在这种情况下,内存使用
  • varchar对于搜索来说更糟糕,但好处是允许您在将来更改参考策略(即包含一些字母),而无需更改数据库。为未来做好准备总是好的。

对于使用varchar的搜索性能问题,这不是一个真正的问题,因为你只需要在该列中创建索引,因此MySQL服务器不必迭代通过记录,和每次搜索几乎一样快,就像在一个int 。所以varchar的缺点得到了解决,专业人士仍在那里。

在创建表之后创建索引只需要这个简单的sql:

ALTER TABLE `orders` ADD INDEX (`order_id`); 

有了这个,引擎将创建并维护一个由该字段排序的辅助列表,所以任何搜索都可以在字典中找到一个单词,你不必遍历所有的单词,因为你知道如果存在的话,每个单词都会很好。

<强>更新

另外,我会使用额外的DATETIME列,因此可以通过此列进行与时间相关的搜索。我想你已经有了。

答案 2 :(得分:0)

如果您愿意,可以使用VARCHAR列,也可以使用BIGINT。你没有定义“迅速”,但在大多数情况下,这两者都会很快。

BIGINT的优势是order_id BETWEEN ? AND ?之类的查询如果在该列上编入索引,则运行速度会更快。

答案 3 :(得分:0)

我认为最好将其存储在varcharBIGINT列中

来自MYSQL DOC

  

一个大整数。签署的范围是-9223372036854775808到   9223372036854775807.无符号范围是0到18446744073709551615。

答案 4 :(得分:0)

您可以使用BIGINT DataType存储此大小的值。来自MySQL文档

  

一个大整数。签署的范围是-9223372036854775808到   9223372036854775807.无符号范围是0到18446744073709551615。

从设计的角度来看,答案一如既往,是“取决于”这是否是一个好主意等,您想要如何检索数据等。如果您需要根据创建时间检索数据,那么您应该在数据库中有一列来表示CreateTime。不要依赖于您的订单ID计算日期时间。一旦您拥有大量数据并且需要运行查询,这将无法很好地扩展。