我有一个问题,我需要将Amazon.com的订单号存储到MySQL表中。 Amazon.com订单号由数字和连字符组成,如102-1234567-1234567(17个数字和2个连字符)。我已经看到这个“数字”存储为字符串,因为在某些情况下使用连字符,随后,对此列的搜索是字符串搜索而不是数字搜索。
现在,我只是将它们存储为VARCHAR(19),但是有没有办法存储它,以便在存储和检索时更高效,更快捷?例如,我考虑将每个数字段解析为它自己的一列(一个订单“数字”总共3列)并执行... WHERE colA=102 AND colB=1234567 AND colC=1234567
以提取特定订单,而不是执行...WHERE col LIKE '102-1234567-1234567'
。我知道前者使用的字节少得多,但是它也更快吗?我正在研究的表格有超过10万行,每天只增加一小部分。
关于我应该如何修改结构或不应该如何修改的任何建议或意见? TIA!
答案 0 :(得分:3)
这些订单号实际上不是数字。这些是字符串,因此应该存储为字符串。
我不知道亚马逊订单的细节,但如果它们总是19个字符长,你可以使用CHAR(19)而不是VARCHAR(19)以及使用ASCII字符集而不是任何多字节。这应该会让它快一点。同时创建一个完全覆盖列的索引(即长度为19)也可能有助于提高性能,也可以使用=
代替LIKE
。
答案 1 :(得分:2)
请勿分离亚马逊当前订单号的三个数字外观。您的数据库引擎足够快,可以在其列正确编制索引时按此编号查找订单。我从这里的问题中得到了“过早优化”的意义。
考虑以下建议:
将您的列扩展为varchar(100)
或大于19的内容。您依赖于供应商,并假设其结构永远不会发生变化。
在此列上添加索引。 100K行是一个非常小的数据集。
找到平等,而不是像你现在所做的那样。 WHERE Order='123-456-234