2011-02-12 30 views
2

那麼,我一直在處理大量的網絡數據。我必須過濾掉一些IP地址並存儲他們與其他IP的通信。但是IP的數量巨大,數十萬,爲此我必須創建如此多的表格。最終,我的MySQL訪問速度會減慢,一切都會減慢。每張桌子都有幾列,很多行。
替代存儲大量的表 - MySQL

我的問題:
有沒有更好的辦法來解決這個問題,我的意思是存儲每個IP的數據?
有沒有類似桌子的桌子?

[編輯] 我在不同的表中存儲的原因是,我不得不隨時間推移刪除和添加條目。
下面是表結構
CREATE TABLE IP(syn_time datetime, source_ip varchar(18), dest_ip varchar(18));

我使用C++來訪問與ODBC連接器

+1

爲什麼你必須創建新的物理表?這些表是否有不同的結構,或者是否一次又一次地複製相同的表結構?那(動態地創建許多表)通常表明總體設計有問題。 – FrustratedWithFormsDesigner 2011-02-12 05:15:04

+0

你會在一些SQL DDL語句中向我們展示如何在此刻執行此操作嗎?目前還不清楚爲什麼你需要存儲很多表格 - 你的意思是行嗎? – iain 2011-02-12 05:15:10

+0

爲什麼你必須在很多桌子上做呢?爲什麼不像我們其他人一樣將數十萬行存儲在一張表中? – 2011-02-12 05:15:34

回答

1
  • 不要滴/創建表頻繁。 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

0

動態創建表幾乎總是一個壞主意。替代方案是標準化。我不會談論這方面的學術細節,但我會嘗試用更簡單的術語來解釋它。

您可以將數據之間的關係分爲三種類型:一對一,一對多和多對多。考慮一下數據的每一位與其他位的關係以及它具有哪種類型的關係。

  • 如果數據關係是一個對一個, 那麼你可以通常只是把它貼在 同一個表的同一行。 有時可能有一個理由將它分開,就好像它是一對多的 ,但一般來說, 將它們全部放在同一個地方。

  • 如果數據關係是 一個一對多的,應當引用的表 兩者之間通過它的主 鍵(你給每個表 主鍵,對吧?)。一對多的「一」側 應該有一個字段 ,該字段引用其他表的主關鍵字 。這個字段被稱爲 一個外鍵。

  • 多對多是最複雜的關係,聽起來像你 有一些這些。你必須 創建一個連接表。該表將包含兩個外鍵字段 ,其中一個表爲 ,另一個爲 。對於兩個 記錄之間的每個鏈接,您將在連接表中添加一條記錄到 。

希望這應該讓你開始。