替代存储大量表 - MySQL

时间:2011-02-12 05:11:31

标签: mysql

好吧,我一直在处理大量的网络数据。我必须过滤掉一些IP地址并存储与其他IP的通信。但是IP的数量是巨大的,数十万,我必须创建这么多的表。最终我的MySQL访问速度会变慢,一切都会变慢。每个表都有几列,多行。

我的问题:
有没有更好的方法来解决这个问题,我的意思是存储每个IP的数据? 有桌子的表吗?

[编辑] 我存储在不同表中的原因是,我必须随着时间的推移不断删除和添加条目 这是表结构
CREATE TABLE IP(syn_time datetime, source_ip varchar(18), dest_ip varchar(18));

我使用C ++访问ODBC连接器

2 个答案:

答案 0 :(得分:1)

  • 不要经常DROP / CREATE表。 MySQL这样做很麻烦,可以理解的是 - 只有在新机器上创建数据库时才应该这样做。它会损害缓冲池命中率等因素​​,磁盘IO也会出现问题。

  • 相反,请使用InnoDB或xtradb,这意味着您可以在插入新行时删除旧行。

  • 将IP存储在int(10) unsigned类型的列中,例如192.168.10.50将存储为(192 * 2 ^ 24)+(168 * 2 ^ 16)+(10 * 2 ^ 8)+ 50 = 3232238130

  • 将所有信息放入1个表格中,并在索引列上使用SELECT ... WHERE

答案 1 :(得分:0)

动态创建表几乎总是一个坏主意。替代方案是规范化。我不会详细介绍其中的学术细节,但我会尝试用更简单的术语来解释它。

您可以将数据之间的关系分为三种类型:一对一,一对多和多对多。想想每个数据位如何与其他位相关以及它具有哪种类型的关系。

  • 如果数据关系是一对一的, 那么你通常可以坚持下去 同一个表的同一行。 偶尔可能有理由 将它分开就像它一样 一对多,但一般来说, 把它们全部放在同一个地方。

  • 如果是数据关系 一对多,应该引用 两个表之间的主要原因 钥匙(你给了每张桌子一张 主键,对吗?)。 “一”方面 一对多应该有一个领域 它引用了主键 另一张桌子。该字段被调用 外键。

  • 多对多是最复杂的 关系,听起来像你 有一些这些。你必须 创建一个连接表。这张表会 包含两个外键字段,一个 一张桌子和另一张桌子 其他。对于两个之间的每个链接 记录,你将添加一条记录 你的联接表。

希望这可以让你开始。