【问题标题】:Big mysql database for ips用于ips的大型mysql数据库
【发布时间】:2013-07-10 07:44:38
【问题描述】:

我的项目的一部分涉及在我的数据库中存储和检索大量 ips。我估计在项目启动后的几个月内我的数据库将拥有数百万个 ip。既然如此,我想知道对大型数据库的简单查询有多慢?以下查询的大致速度是多少:

SELECT * FROM table where ip= '$ip' LIMIT 1
INSERT INTO table(ip, xxx, yyy)VALUES('$ip', '$xxx', '$yyy')

在有 2.65 亿行的表上?

我是否可以通过创建 255^2 个表来加快查询速度,这些表的名称对应于所有可能的 ipv4 ip 地址的所有前两个数字,然后每个表最多有 255^2 行可以容纳所有ip的可能第二部分。因此,例如要查询 IP 地址“216.27.61.137”,它将被分成两部分,“216.27”(p1)和“61.137”(p2)。首先,脚本会选择名称为 p1 的表,然后它会检查是否有任何名为“p2”的行,如果有,它将从该行中提取所需的数据。将使用相同的过程将新的 ips 插入到数据库中。

如果上述计划不起作用,那么在大型数据库中加快查询速度的好方法是什么?

【问题讨论】:

  • 阅读 MySQL 中的 INDEXs。
  • 使用 IPv4 地址的字符串表示会比使用 UNSIGNED INT 慢很多。对于 IPv6 兼容性,您会被字符串困住,而且它们会更长。分片在这里不是一个坏主意,但前提是你会有插入争用。值得注意的是,Postgres 支持IP addresses as a native column type
  • mysql 不是唯一的开源关系数据库管理系统

标签: php mysql database ip bigdata


【解决方案1】:

这两个问题的答案都取决于INDEXES 的使用。

如果您的表在ip 上建立索引,您的第一个查询应该或多或少立即执行,无论您的表有多大:MySQL 将使用该索引。您的第二个查询会变慢,因为 MySQL 必须更新每个 INSERT 的索引。

如果您的表没有索引,那么第二个查询将几乎立即执行,因为 MySQL 可以将行添加到表的末尾。您的第一个查询可能无法使用,因为 MySQL 每次都必须扫描整个表。

问题是平衡。添加索引将加快第一个查询,但减慢第二个查询。究竟会发生什么将取决于服务器硬件、您选择的数据库引擎、MySQL 的配置以及当时正在发生的其他事情。如果性能可能很关键,请先进行一些测试。

【讨论】:

    【解决方案2】:

    在进行任何此类操作之前,请阅读此问题(更重要的是)其答案:How to store an IP in mySQL

    在多个表之间拆分数据通常不是一个好主意。数据库索引擅长它们的工作,因此只需确保相应地创建它们。存储 IPv4 地址的二进制列会很好地工作 - 它更多的是查询负载问题而不是表大小。

    【讨论】:

      【解决方案3】:

      首先,您无法预测查询需要多长时间,即使我们知道有关数据库、数据库服务器、网络性能和其他数千个变量的所有信息。

      其次,如果您使用的是不错的数据库引擎,则不必将数据拆分到不同的表中。它知道如何处理大数据。将数据库功能留给数据库本身。

      有几种解决方法可以处理大型数据集。使用正确的数据类型并创建正确的索引会有很大帮助。

      当您的数据库开始出现问题时,请搜索特定于您遇到的问题的内容。

      大数据问题没有灵丹妙药。

      【讨论】:

        猜你喜欢
        • 2018-06-08
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多