当前位置: 首页
科技数码
存储IP的正确方式:告别VARCHAR,性能提升十倍的秘诀

存储IP的正确方式:告别VARCHAR,性能提升十倍的秘诀

热心网友 时间:2025-12-22
转载

如果存储方式选错了,未来不仅浪费空间,还可能导致查询性能低下。今天我就带你一步一步搞懂如何在 MySQL 里优雅地存储 IP 地址。 当我们在使用 MySQL 设计表结构的时候都会遇到一个经典问题:

如果存储方式选错了,未来不仅浪费空间,还可能导致查询性能下降。今天我就带你一步一步搞懂如何在 MySQL 里优雅地存储 IP 地址。

当我们在使用 MySQL 设计表结构的时候都会遇到一个经典问题:“如果要存 IP 地址,到底该用什么数据类型?”

别小看这个问题,存储方式一旦选错,不仅会浪费宝贵的存储空间,未来进行数据查询时也可能拖慢整个系统的速度。接下来,我们就深入探讨一下在 MySQL 中高效存储 IP 地址的正确方法。

为啥不能直接用字符串?

很多小伙伴的第一反应是:IP 地址不就是“192.168.0.1”这种字符串吗?那我直接用VARCHAR(15) 或者 CHAR(15) 存不就行了吗?

表面上来看没啥大的问题,但这样做有几个明显的弊端:

  • 空间浪费:字符串比数字类型占用更多字节,还要额外存储长度信息。
  • 查询效率低:字符串比较比数字比较要慢,索引效果也差。
  • 不方便计算:比如要判断 IP 是否落在某个网段里,字符串处理起来就很麻烦。

所以,直接用字符串存 IP 地址,只能算是最简单但不优雅的做法。

那么,到底该怎么做才比较合适呢?

IPv4:用INT UNSIGNED存整数更高效

IPv4 地址其实就是一个32位的整数,比如:

192.168.0.1 → 3232235521

在 MySQL 里我们完全可以用INT UNSIGNED类型来存储,既节省空间(4字节),又利于索引和范围查询。

插入时,用INET_ATON()转换:

INSERT INTO user_logs(ip) VALUES (INET_ATON('192.168.0.1'));

查询时,用INET_NTOA()再转回字符串:

SELECT INET_NTOA(ip) FROM user_logs;

这样就能同时兼顾空间效率和查询效率。

IPv6:用BINARY(16)存二进制

IPv6 地址更长,是128位,像这样:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

如果直接用字符串存,需要 CHAR(39),非常浪费空间。

更推荐的做法是用 BINARY(16) 或 VARBINARY(16) 存二进制形式。

MySQL 也有直接现成的函数:

插入时,用INET6_ATON():

INSERT INTO user_logs(ipv6) VALUES (INET6_ATON('2001:db8::1'));

查询时,用INET6_NTOA() 转回:

SELECT INET6_NTOA(ipv6) FROM user_logs;

占用空间16字节,支持索引,性能杠杠滴。

那么,如果既要支持 IPv4,又要支持 IPv6 怎么办呢?

这就更简单了,直接:

字段类型设为 VARBINARY(16) 或 BINARY(16),统一用 INET6_ATON()/INET6_NTOA() 存取

MySQL 会自动把 IPv4 地址映射到 IPv6 格式里,做到兼容存储,是不是非常 nice?

来个实战

以下面的建表语句为例:

CREATE TABLE user_logs (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ip BINARY(16) NOT NULL COMMENT '存储IPv4/IPv6地址',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 插入IPv4
INSERT INTO user_logs(ip) VALUES (INET6_ATON('192.168.0.1'));

-- 插入IPv6
INSERT INTO user_logs(ip) VALUES (INET6_ATON('2001:db8::1'));

-- 查询
SELECT INET6_NTOA(ip) AS ip_address FROM user_logs;

一套方案,IPv4 + IPv6 通吃,相当 OK

来源:https://www.51cto.com/article/832099.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
高刷显示器提升FPS游戏命中率,LG Display研究证实

高刷显示器提升FPS游戏命中率,LG Display研究证实

LGDisplay研究显示,31名玩家在60Hz至480Hz刷新率下测试第一人称射击游戏。对比60Hz,480HzOLED显示器命中率提升约38%,其中60Hz升至240Hz提升最为显著,再升至480Hz再增约10%,输入延迟减少超过10毫秒。

时间:2026-07-12 12:41
年确认不插入闰秒,距上次调整已10年

年确认不插入闰秒,距上次调整已10年

国际地球自转和参考系服务宣布2026年末不插入闰秒,距上次调整已隔十年。闰秒用于协调原子时与地球自转时,已调整27次均为正闰秒。因气候变化导致地球自转减速,首个负闰秒推迟至2029年,国际计量界计划2035年前废止闰秒机制。

时间:2026-07-12 12:41
红米Note 17 Pro首销活动送电池升级保五年免费换新

红米Note 17 Pro首销活动送电池升级保五年免费换新

REDMINote17Pro首发提供五年电池升级保障:前四年电池健康低于80%免费换新,第五年升级为更大容量电池。内置9000mAh电池,支持67W快充与22 5W反向充电,配备康宁大猩猩Victus2玻璃及四重防水认证,防护规格对标旗舰。

时间:2026-07-12 12:41
三星A18渲染图曝光 机身变厚或搭载6000mAh电池

三星A18渲染图曝光 机身变厚或搭载6000mAh电池

据悉,三星A18最新渲染图曝光,其机身厚度增至7 84毫米,较上一代增加0 34毫米,推测或为配备6000毫安时大容量电池。此外,外观延续水滴屏设计,后置三摄模组有微调,并且底部配备USB-C接口,还支持快速充电功能。

时间:2026-07-12 12:41
三星S26像素级防窥屏幕隐私保护再升级

三星S26像素级防窥屏幕隐私保护再升级

三星GalaxyS26系列搭载像素级隐私显示技术,从硬件层面控制OLED子像素发光方向,实现物理级防窥,正面观看画质无损,侧面超60°即模糊。该功能深度集成OneUI8 5,支持智能场景触发和多档位强度调节,与Knox安全平台形成防护体系,无需贴膜,不损画质。

时间:2026-07-12 12:40
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 热门数据榜