我将 IPv4 地址存储在带有 inet_aton 的“int unsigned”列类型中。[我这样做对吗?并且是否需要使用“无符号”?] 这个特定的列也被索引了。由于在整个表中将有数百万行和多行包含相同的 IP,因此搜索这些行的最快方法是什么?
..还是我走错路了?
我将 IPv4 地址存储在带有 inet_aton 的“int unsigned”列类型中。[我这样做对吗?并且是否需要使用“无符号”?] 这个特定的列也被索引了。由于在整个表中将有数百万行和多行包含相同的 IP,因此搜索这些行的最快方法是什么?
..还是我走错路了?
使用 inet_aton 是这样做的正确方法,因此您不会存储额外的无意义信息(对于任何给定的 3 个数字,没有必要存储大于 256 的值)。它产生一个 32 位数字,将适合无符号整数。
在 int 列上建立索引将使按 IP 地址快速查找。如果您的数据库变得非常大,您将开始遇到在 MySQL 中存储此类内容的扩展问题。
我假设您不会这样做,但会指出在 RDBMS 中存储大型繁忙站点的完整日志信息通常被认为是一件坏事(tm)。你不需要数据库保证的关系完整性属性,而且你写的条目比你读的多得多。考虑使用 nosql,或者改为附加到平面文件,并在必要时使用专用程序解析日志。
我这样做对吗?并且有必要使用“未签名”吗?
是的。如果没有unsigned
更高的 ip 地址,将无法正确存储,而使用int
(而不是varchar
)最有效地存储它。
搜索这些行的最快方法是什么?
至于搜索优化,这取决于您要搜索的所有内容(其他表等......)。通常,为 unsigned int 列建立索引可以提高性能。
是的,这是在 MySQL 中存储 IP 地址的最佳方式。
如果您查看INET_ATON的文档,您会发现建议使用 UNSIGNED INT 列,否则第一个八进制数超过 127 的任何 IP 地址都将无法正确存储。
这也是一种非常快速的搜索方式。MySQL 很好地处理整数列,通过索引该列并在搜索中使用 INET_ATON,您可以实现非常快速的查询。