这星期我们在办公室进行了一场健康的辩论。我们正在创建一个Db来存储代理信息,在大多数情况下,除了应该如何存储IP之外,我们还制定了模式。一个阵营想要使用4个smallint,每个八位位组一个,另一个希望使用1个大int
INET_ATON。
这些表将非常庞大,因此性能至关重要。我处于中间位置,因为我通常在世界中使用MS SQL和4个小整数。我对这种类型的IP存储量没有足够的经验。
我们将使用perl和python脚本访问数据库,以将数据进一步归一化为其他几张表格,以供谈话者,有趣的流量等使用。
我确定社区中有些人所做的事情与我们正在做的事情类似,并且我很想听听他们的经验以及哪种路线最好,IP地址是1大整数还是4小整数。
编辑 -我们关注的问题之一是空间,该数据库将变得庞大,例如每天有5亿条记录。因此,我们试图权衡空间问题和性能问题。
编辑2
有些对话已经转移到我们将要存储的数据量上……这不是我的问题。问题是哪种是存储IP地址的最佳方式,为什么。就像我在评论中所说,我们为一家财富50强的公司工作。我们的日志文件包含来自用户的使用情况数据。反过来,这些数据将在安全上下文中用于驱动某些指标并驱动多个安全工具。
我建议您查看将要运行的查询类型,以决定采用哪种格式。
仅当您需要提取或比较各个八位位组时,才需要考虑将它们分成单独的字段。
否则,将其存储为4字节整数。这也有让您使用内置的MySQL的奖金INET_ATON()
和INET_NTOA()
功能。
存储:
如果仅支持IPv4地址,则MySQL中的数据类型可以是UNSIGNED INT
仅使用4个字节存储空间的数据类型。
要存储单个八位位组,您只需要使用UNSIGNED TINYINT
数据类型,而不是SMALLINTS
,这将占用每个存储空间1个字节。
两种方法都将使用类似的存储,可能会为单独的字段使用更多的存储空间,从而产生一些开销。
更多信息:
性能:
使用单个字段将产生更好的性能,它是单个比较而不是4。您提到您将只对整个IP地址运行查询,因此不必将八位字节分开。使用INET_*
MySQL
的功能将在文本和整数表示之间进行一次转换以进行比较。
问题内容: 我有一个具有数据类型joda.money属性的类。如何将这个属性映射到mysql中。 我的课是: @Table(name =“ products”)公共类Product(){@Column(name =“ name”)字符串名称;@Column(name =“ money”)金钱金钱;} 我正在使用Spring Hibernate 谁能说出如何将此模型存储到mysql中? 问题答案:
问题内容: 如何在免费版本的MySQL中存储Unicode? 在SQL Server中似乎没有类型。MySQL不支持Unicode吗?我尝试使用,但是那也不起作用。 问题答案: 您需要为表选择一个 字符集。然后,文本和备注字段将自动存储在UTF-8中。MySQL 6中提供了对UTF-16的支持。
问题内容: 我尝试将DECIMAL与(2,2)一起使用,但不允许我使用。 我只想存储一个数字,例如7.50或10.50。我需要将两个数字都保留在小数点后,但是当我刷新数据库时,它将值重置为0.99。有什么建议么? 问题答案: 声明的第一位数字是 总数 。您可能想要使用。这允许小数点前最多两位数,小数点后两位数。 文档:https : //dev.mysql.com/doc/refman/5.7/e
问题内容: 我在MySQL中有两个表。表人具有以下列: 该列可以包含null或字符串数组,例如(’apple’,’orange’,’banana’)或(’strawberry’)等。第二个表是Table Fruit,具有以下三列: 那么,我应该如何设计第一个表中的列,以便它可以容纳从第二个表中的列获取值的字符串数组?由于MySQL中没有数组数据类型,该怎么办? 问题答案: 正确的方法是在查询中
我在MySQL中有两个表。Table Person具有以下列: 水果列可以包含null或字符串数组,如('apple','orange','banana')或('草莓')等。第二个表是水果表,有以下三列: 那么,我应该如何设计第一个表中的水果列,以便它可以容纳从第二个表中的水果名称列获取值的字符串数组?既然MySQL中没有数组数据类型,我应该怎么做?
问题内容: 我使用varchar(36)还是有更好的方法呢? 问题答案: 当我问到为对象存储GUID的最佳方法时,我的DBA问我为什么当我可以用Integer以4字节进行相同的操作时为什么需要存储16字节。自从他向我提出挑战以来,我认为现在是提起挑战的好时机。话虽如此… 如果要最大程度地利用存储空间,可以将GUId存储为CHAR(16)二进制文件。