好吧,我一直在处理大量的网络数据。我必须过滤掉一些IP地址并存储与其他IP的通信。但是IP的数量是巨大的,数十万,我必须创建这么多的表。最终我的MySQL访问速度会变慢,一切都会变慢。每个表都有几列,多行。
我的问题:
有没有更好的方法来解决这个问题,我的意思是存储每个IP的数据?
有桌子的表吗?
[编辑]
我存储在不同表中的原因是,我必须随着时间的推移不断删除和添加条目
这是表结构
CREATE TABLE IP(syn_time datetime, source_ip varchar(18), dest_ip varchar(18));
我使用C ++访问ODBC连接器
答案 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)
动态创建表几乎总是一个坏主意。替代方案是规范化。我不会详细介绍其中的学术细节,但我会尝试用更简单的术语来解释它。
您可以将数据之间的关系分为三种类型:一对一,一对多和多对多。想想每个数据位如何与其他位相关以及它具有哪种类型的关系。
如果数据关系是一对一的, 那么你通常可以坚持下去 同一个表的同一行。 偶尔可能有理由 将它分开就像它一样 一对多,但一般来说, 把它们全部放在同一个地方。
如果是数据关系 一对多,应该引用 两个表之间的主要原因 钥匙(你给了每张桌子一张 主键,对吗?)。 “一”方面 一对多应该有一个领域 它引用了主键 另一张桌子。该字段被调用 外键。
希望这可以让你开始。