3

我将 IPv4 地址存储在带有 inet_aton 的“int unsigned”列类型中。[我这样做对吗?并且是否需要使用“无符号”?] 这个特定的列也被索引了。由于在整个表中将有数百万行和多行包含相同的 IP,因此搜索这些行的最快方法是什么?

..还是我走错路了?

4

3 回答 3

2

使用 inet_aton 是这样做的正确方法,因此您不会存储额外的无意义信息(对于任何给定的 3 个数字,没有必要存储大于 256 的值)。它产生一个 32 位数字,将适合无符号整数。

在 int 列上建立索引将使按 IP 地址快速查找。如果您的数据库变得非常大,您将开始遇到在 MySQL 中存储此类内容的扩展问题。

我假设您不会这样做,但会指出在 RDBMS 中存储大型繁忙站点的完整日志信息通常被认为是一件坏事(tm)。你不需要数据库保证的关系完整性属性,而且你写的条目比你读的多得多。考虑使用 nosql,或者改为附加到平面文件,并在必要时使用专用程序解析日志。

于 2010-10-20T17:18:00.250 回答
1

我这样做对吗?并且有必要使用“未签名”吗?

是的。如果没有unsigned更高的 ip 地址,将无法正确存储,而使用int(而不是varchar)最有效地存储它。

搜索这些行的最快方法是什么?

至于搜索优化,这取决于您要搜索的所有内容(其他表等......)。通常,为 unsigned int 列建立索引可以提高性能。

于 2010-10-20T17:16:57.800 回答
1

是的,这是在 MySQL 中存储 IP 地址的最佳方式。

如果您查看INET_ATON的文档,您会发现建议使用 UNSIGNED INT 列,否则第一个八进制数超过 127 的任何 IP 地址都将无法正确存储。

这也是一种非常快速的搜索方式。MySQL 很好地处理整数列,通过索引该列并在搜索中使用 INET_ATON,您可以实现非常快速的查询。

于 2010-10-20T17:24:22.320 回答