2011-06-22 102 views
2

我有一个关于索引的“最佳实践”问题。mysql索引问题

我必须索引电话号码,我通常将column设置为整数。我可以把这个号码分成多列:区号,后缀,前缀,国家代码。但由于我必须考虑国际数据,而且某些国家/地区的数字有点滑稽,我宁愿保留一列。

所以我的问题是,我应该保留列数据保存为整数,字符或varchars? 我会去掉任何非int相关的东西,所以varchar可能不需要。

我必须为我的客户提供搜索功能,因此我需要索引号码。 如果所有的电话号码都来自美国,那么我会分开列,但我也迎合国际。

所以我很好奇索引部分和其他人在这个舞台上的做法。用整数(对于这样的事情)索引是最好的,还是它很重要。

作为一个侧面说明,电话号码将不会是所有长度相同。这就是为什么我会询问如何格式化char或varchar中的列结构。

谢谢你们!

+1

我认为保持它作为varchar更有意义,因为它将空间要求保持在最低限度。然后,您可以在完整列上索引,也可以只索引几个初始字符。但我认为电话号码索引无论如何都无济于事,因为所有(或几乎所有)条目都有唯一的电话号码。 – Abhay

+0

如果您要在WHERE子句中(或在联接中)使用电话号码,则需要为其编制索引,尤其是在电话号码对每行都是唯一的情况下。 – Rafe

回答

2

表格预计有多大?我问的原因是,整数的索引显然会变小,但在一张小桌子上,这不是主要考虑因素。使用varchar可以更灵活地执行诸如“... WHERE phonenumber like'415%'等等的操作,代价是一个更大的索引。如果表格非常大,并且它运行的盒子全部是内存 - 您可能会遇到索引不符合内存条件的情况,您可以根据索引将查询发送到swap地狱,这可以通过您选择的存储引擎加剧:InnoDB在每个索引前加上主键,例如,可臃肿的索引,如果你的PK是在广泛的领域或多个领域。

+0

我实际上有几个数据库的电话号码。而我见过的最大的是大约5M的数字。当然,这些数字不会有太多重复,但该区域有许多重复的区域码和前缀。这有助于搜索特定区域。 – coffeemonitor

1

电话号码可以包括#和*,所以我会建议不要使用整数。
也是国际前缀是+这是为了支持国际前缀无论你在哪个国家。

例如在南非,您需要在国家代码前加09;在欧洲,前缀是00
为了使数字在任何地方都能正常工作,请用+替换国际前缀,并且您的手机将使用本地前缀替代此号码以拨打国外。

我会使用一个varchar的电话号码。

此外,我会使用一个整数auto_increment作为主键,并使用电话号码作为辅助键,以保持在InnoDB snappy上的性能。
还记得人们可以'分享'一个电话号码,所以它不能保证是唯一的。