如何有效在MySQL存储IP地址?
在《高性能MySQL》,作者建议当存储IPv4地址时,应当使用32位的无符号整数(UNSIGNEDINT)来存储IP地址,而不是使用字符串的原理一样。由于一个int型的数据占4个字节,每一个字节8位,其范围就是0~(2^81),而ipv4地址可以分成4段,每段的范围是0~255刚恰好能存下,所以将其稍稍转换,就奇妙的将IP地址用最小的空间存在了数据库中(接下来的描写若无特殊说明,则都是指的ipv4地址)。可能你会觉得这个小小的改变没有甚么关系,但是当数据量愈来愈多的时候,15个字节和4个字节相差的数据量会让你吃惊。所以在设计数据库的时候,字段类型用适合的,够用就行,能省则省。
相对字符串存储,使用无符号整数来存储有以下的好处:
1.节省空间,不论是数据存储空间,或索引存储空间
2.便于使用范围查询(BETWEEN...AND),且效力更高
通常,在保存IPv4地址时,一个IPv4最小需要7个字符,最大需要15个字符,所以,使用VARCHAR(15)便可。MySQL在保存变长的字符串时,还需要额外的一个字节来保存此字符串的长度。而如果使用无符号整数来存储,只需要4个字节便可。另外还可使用4个字段分别存储IPv4中的各部份,但是通常这不论是存储空间和查询效力应当都不是很高(虽然有的场景合适使用这类方式存储)。不过使用无符号整数来存储也有不便于浏览和需要手动转换的缺点。