我有一個數據庫每秒查詢很多。查詢搜索IP地址值。 因此,將例如34.549.53.23這樣的IP存儲爲int值:345495323是否合理? 查詢速度會更快嗎?MySQL將IP作爲int存儲以獲得更高性能?
我知道,例如,123.12.3.123和123.1.2.3.1.2.3都存儲爲123123123,但這並不重要。
我有一個數據庫每秒查詢很多。查詢搜索IP地址值。 因此,將例如34.549.53.23這樣的IP存儲爲int值:345495323是否合理? 查詢速度會更快嗎?MySQL將IP作爲int存儲以獲得更高性能?
我知道,例如,123.12.3.123和123.1.2.3.1.2.3都存儲爲123123123,但這並不重要。
雖然我認爲這是微型優化,但您可以使用函數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
,更重要的是容易被人記住。 (除了關於子網羣可讀性的其他優點外)
是的,查詢會更快。還要將IP保存爲整數,請使用mysql的INET_ATON()
,並從整數使用INET_NTOA()
獲取IP地址。普萊斯請參閱本頁面瞭解更多信息
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
如果您正在使用PHP想你可以使用ip2long()
和long2ip()
反之亦然
34.549.53.23和123.1.2.3.1.2.3 ARN沒有有效的IP – Dinistro
@Dinistro就是它的一個例子! –
如果您不能將它用作IP,那麼存儲3212321321有什麼意義? – alou