我有一个关于索引的“最佳实践”问题。
我必须索引电话号码,我通常会将column
格式化为整数。我可以将数字分成多个列:areacode,suffix,prefix,country code。但由于我必须考虑国际号码,并且某些国家的数字有点搞笑,我更愿意保留一栏。
所以我的问题是,我应该保留为整数,字符还是varchars保存的列数据? 我删除任何非int相关的东西,因此可能不需要varchar。
我必须为我的客户提供搜索能力,因此我需要索引该号码。 如果所有的电话号码都是来自美国,那么我会把这些专栏分开,但我也会为国际提供服务。
所以我很好奇索引部分,以及其他人在这个领域的做法。
是否最好用整数(对于这样的东西)进行索引,或者甚至是重要的。作为旁注,电话号码的长度不会相同。这就是我要求在char或varchar中格式化列结构的原因。
谢谢你们!答案 0 :(得分:2)
预计这张桌有多大?我问的原因是,明显的是,整体上的指数会变小,但在一张小桌子上,这不是主要的考虑因素。使用varchar可以让你更灵活地执行诸如“...等''等',如同'更大的索引'这样的话。如果表格非常大,而且它运行的盒子在所有内存中 - 受限制,您可以遇到索引不适合内存的情况,将针对该索引的查询发送到交换地狱。这可能会因您选择的存储引擎而加剧:InnoDB使用主键为每个索引添加前缀,例如,如果您的PK在广泛的字段或字段上,这会使您的索引膨胀。
答案 1 :(得分:1)
电话号码可以包含#和*,因此我建议不要使用整数
此外,国际前缀为+
,这是为了支持国际前缀,无论您身在何处。
e.g。在南非,您需要在国家/地区代码前添加09
;在欧洲,前缀是00
为了使数字在任何地方都能正常工作,您可以用+
替换国际前缀,并且您的手机将替换为本地前缀拨打国外。
我会使用varchar作为电话号码。
此外,我使用整数auto_increment作为主键,并使用电话号码作为辅助键,以保持InnoDB snappy的性能。
还要记住,人们可以“分享”一个电话号码,所以不能保证是唯一的。