【问题标题】:Alternate to storing Large number of tables -- MySQL存储大量表的替代方法——MySQL
【发布时间】:2011-02-12 05:11:31
【问题描述】:

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

我的问题:
有没有更好的方法来处理这个问题,我的意思是存储每个 IP 的数据?
有没有类似表格的东西?

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

我使用 C++ 通过 ODBC 连接器进行访问

【问题讨论】:

  • 为什么要创建新的物理表?这些表是否具有不同的结构,还是一遍又一遍地复制相同的表结构?这(动态创建许多表)通常表明整体设计有问题。
  • 请您输入一些 SQL DDL 语句来向我们展示您目前是如何执行此操作的,好吗?目前尚不清楚为什么需要存储大量表 - 您是指行吗?
  • 为什么必须跨多个表执行此操作?为什么不像我们其他人一样将数十万行存储在一张表中?
  • 另外,多一点信息会有帮助。 IE。数据是如何进入 MySQL 数据库的:PHP 等

标签: mysql


【解决方案1】:
  • 不要频繁地删除/创建表。 MySQL 在这方面非常有问题,这是可以理解的——它应该只在新机器上创建数据库时执行一次。它会损害缓冲池命中率等因素​​,并且磁盘 IO 会激增。

  • 改为使用 InnoDB 或 xtradb,这意味着您可以在插入新行的同时删除旧行。

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

  • 将所有信息放入一张表中,只需在索引列上使用SELECT ... WHERE

【讨论】:

  • 我喜欢你存储 IP 地址的方式。我会尝试一些数据库引擎,比如 innoDB,看看我有什么。谢谢
【解决方案2】:

动态创建表几乎总是一个坏主意。另一种方法是规范化。我不会深入讨论其中的学术细节,但我会尝试用更简单的术语来解释它。

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

  • 如果数据关系是一对一的, 然后你通常可以把它放进去 同一张表的同一行。 有时可能有理由 把它分开 一对多,但一般来说, 把它们都粘在同一个地方。

  • 如果数据关系是 一对多,应该引用 在两个表之间由它的主要 键(你给每个表一个 主键,对吧?)。 “一”面 一对多的应该有一个字段 它引用的主键 另一张桌子。这个字段被称为 外键。

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

希望这能让你开始。

【讨论】:

  • 我应该了解数据库概念而不是解决问题。感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 2016-01-23
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2010-12-31
相关资源
最近更新 更多