2009-11-30 54 views
-1

這是一個表設計問題。我有一個存儲IP地址的表格。查詢表中的數據非常繁重。這些IP可以具有不同的標誌,例如「解鎖」,「暫時阻止」和「永久阻止」。 95%-99%的IP地址上沒有任何類型的塊。限制SQL表中的行數

有沒有辦法在不排除任何數據的情況下限制表中的行數 - 同時將所有數據保留在同一個表中?

對我的建議是在其中一個字段中使用逗號分隔的值(我假設IP地址未被阻止)。然而,我並不完全熟悉這種技術。

+1

通過「限制行數」,我假定你的意思是「保持表中的行數最少」 – 2009-11-30 15:04:46

回答

0

我想你應該有一張表,其中有一個唯一的IP地址列表。對於這些IP地址的交易(例如「解除封鎖」,「暫時封鎖」和「永久封鎖」),您還應該有另一個IP地址。

0

你真的在這個表上有性能問題嗎?

這裏的關鍵是索引;假設您基於IP或標誌(或兩者)建立索引,則無論有多少行,您都應該能夠快速查詢所需的任何行。

如果您擔心性能,但需要保留數據,則始終可以有兩個表 - 一個用於標記IP,一個用於非浮動行。隨着標誌狀態的變化,您需要一組procs /觸發器來插入/刪除行。

不要使用逗號分隔的東西。它使得查詢單個IP更加費力(更不用說必須處理同樣的問題來處理標誌變化......)

2

是IP地址字符串URL,如http://www.Amazon.com,還是它們實際上是虛線的四元組符號?如果它們是後者,並且如果您正在嘗試提高性能,請考慮存儲IP地址的32位整數表示而不是虛線四字符串表示形式。 (您是使用IP4地址還是IP6地址?

xxx.xxx.xxx.xxx的字符串表示佔用15個字節,32位整數只佔用4.爲statusFlag添加一個字節,並且您有一個表只有5個字節的寬度,這應該足以讓每個IP4地址(其中有40億個)在它裏面

0

表中未提及的地址和未被阻止的地址之間的區別是什麼?大多數地址是暢通無阻的,那麼也許你應該通過缺席表示來代表那個?

否則,如果你存儲的是IPv4地址(不是域名),那麼就帶上Charles Bretanas的建議並存儲e地址爲原始整數。如果是這樣,您還可以爲網絡掩碼添加另一個32位整數,因此您可以存儲整個範圍(即阻止每個地址10.0.0.0 - 10.255.255.255,將地址10.0.0.0存儲爲一個整數,網絡掩碼255.0.0.0作爲另一個整數)。這可以極大地減少行數(取決於您的阻止行爲),但它也可以有效地查詢特定地址更復雜一些。

同樣的基本技術也可以應用於IPv6地址,除了它們更長。