适用于ips的大型mysql数据库

时间:2013-07-11 21:05:13

标签: php mysql database ip bigdata

我的项目的一部分涉及在我的数据库中存储和检索ips的负载。我估计我的数据库在启动项目的几个月内将拥有数百万的ips。我想知道对大型数据库的简单查询有多缓慢?以下查询的近似速度是什么:

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插入数据库。

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

3 个答案:

答案 0 :(得分:1)

您的问题的答案取决于INDEXES的使用。

如果您的表在ip上编入索引,那么无论表的大小如何,您的第一个查询都应该立即执行或更少:MySQL将使用索引。由于MySQL必须更新每个INSERT的索引,否则您的第二个查询将会变慢。

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

问题在于平衡。添加索引将加快第一个查询速度但会减慢第二个查询速度。究竟发生了什么将取决于服务器硬件,您选择的数据库引擎,MySQL的配置,当时还有什么。如果性能可能很重要,请先进行一些测试。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

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

大数据问题没有银子弹。

相关问题