2014-05-13 26 views
4

我有一個數據庫每秒查詢很多。查詢搜索IP地址值。 因此,將例如34.549.53.23這樣的IP存儲爲int值:345495323是否合理? 查詢速度會更快嗎?MySQL將IP作爲int存儲以獲得更高性能?

我知道,例如,123.12.3.123和123.1.2.3.1.2.3都存儲爲123123123,但這並不重要。

+0

34.549.53.23和123.1.2.3.1.2.3 ARN沒有有效的IP – Dinistro

+3

@Dinistro就是它的一個例子! –

+0

如果您不能將它用作IP,那麼存儲3212321321有什麼意義? – alou

回答

8

雖然我認爲這是微型優化,但您可以使用函數ip2long()將IP地址的ascii表示轉換爲32位整數並將其轉換回long2ip()

試試:

$int = ip2long('192.168.0.1'); 
echo $int; // 3232235521 

$ip = long2ip(3232235521); 
echo $ip; // 192.168.0.1 

順便說一句,它的IP的字符串表示之間的轉換是整數表示作品不像你期望的那樣。您看到192.168.0.1將轉換爲不是轉換爲19216801.看看它,很明顯這是無法重新轉換的。它是19.216.80.1還是192.168.0.1?

IP地址是以二進制格式存儲的32位整數(與任何數字一樣)。讓我們看看在3232235521(192.168.0.1)二進制表示:

11000000 10101000 00000000 00000001 

我已經分裂成8位單位(字節)爲更好的可讀性。這是電腦所看到的。但這對人類來說很難記住。

從ASCII表示將建立由每轉換字節的值,以十進制和由.將它們分開:

11000000 => 192 
10101000 => 168 
00000000 => 0 
00000001 => 1 

..什麼給你192.168.0.1,更重要的是容易被人記住。 (除了關於子網羣可讀性的其他優點外)

+0

看起來不錯。我不知道你的想法 – Viscocent

+0

簡短,簡單,轟炸目標! – asprin

相關問題